ClearConfigCache.java
package jasper.component.channel;
import jasper.component.ConfigCache;
import jasper.config.Props;
import jasper.service.dto.PluginDto;
import jasper.service.dto.TemplateDto;
import jasper.service.dto.UserDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.messaging.Message;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.stereotype.Component;
import java.time.Instant;
import java.util.concurrent.atomic.AtomicBoolean;
@Component
public class ClearConfigCache {
@Autowired
Props props;
@Autowired
TaskScheduler taskScheduler;
@Autowired
ConfigCache configs;
private AtomicBoolean clearingConfig = new AtomicBoolean(false);
private AtomicBoolean clearConfigAgain = new AtomicBoolean(false);
@Order(Ordered.HIGHEST_PRECEDENCE)
@ServiceActivator(inputChannel = "tagRxChannel")
public void handleTagUpdate(Message<String> message) {
if (!configs.isConfigTag((String) message.getHeaders().get("tag"))) return;
if (clearingConfig.compareAndSet(false, true)) {
clearConfig();
} else {
clearConfigAgain.set(true);
}
}
private void checkIfClearingAgain() {
if (!clearingConfig.get()) return;
var next = clearConfigAgain.getAndSet(false);
clearingConfig.set(next);
if (next) clearConfig();
}
private void clearConfig() {
configs.clearConfigCache();
taskScheduler.schedule(this::checkIfClearingAgain, Instant.now().plusMillis(props.getClearCacheCooldownSec() * 1000L));
}
@Order(Ordered.HIGHEST_PRECEDENCE)
@ServiceActivator(inputChannel = "userRxChannel")
public void handleUserUpdate(Message<UserDto> message) {
// TODO: clear caches by origin
configs.clearUserCache();
}
@Order(Ordered.HIGHEST_PRECEDENCE)
@ServiceActivator(inputChannel = "pluginRxChannel")
public void handlePluginUpdate(Message<PluginDto> message) {
// TODO: clear caches by origin
configs.clearPluginCache();
}
@Order(Ordered.HIGHEST_PRECEDENCE)
@ServiceActivator(inputChannel = "templateRxChannel")
public void handleTemplateUpdate(Message<TemplateDto> message) {
// TODO: clear caches by origin
configs.clearTemplateCache();
}
}