Компоненты
Для регистрации компонентов, которые должны быть инстанцированы при загрузке, зарегистрируйте их отдельно в дескрипторе
yaml
components:
- key: ScriptMetricsListener
name: Metrics listener
className: ru.slie.luna.plugins.gravity.metrics.ScriptMetricsListenerПример компонента:
java
package ru.slie.luna.plugins.gravity.metrics;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import ru.slie.luna.plugins.gravity.script.ScriptRunEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
@Component
public class ScriptMetricsListener implements InitializingBean, DisposableBean {
private final ScriptMetricsManager scriptMetricsManager;
private final ScriptMetricsExecutor scriptMetricsExecutor;
private final BlockingQueue<ScriptRunEvent> batchQueue = new LinkedBlockingQueue<>(50000);
private static final int BATCH_SIZE = 50;
private static final Logger log = LoggerFactory.getLogger(ScriptMetricsListener.class);
private final AtomicBoolean isFlushing = new AtomicBoolean(false);
public ScriptMetricsListener(ScriptMetricsManager scriptMetricsManager,
ScriptMetricsExecutor scriptMetricsExecutor) {
this.scriptMetricsManager = scriptMetricsManager;
this.scriptMetricsExecutor = scriptMetricsExecutor;
}
public void afterPropertiesSet() {
scriptMetricsExecutor.scheduleWithFixedDelay(this::flushBatch, 5, 5, TimeUnit.SECONDS);
}
@Async
@EventListener
public void handleScriptRunEvent(ScriptRunEvent event) {
scriptMetricsExecutor.submit(() -> {
boolean accepted = batchQueue.offer(event);
if (accepted && batchQueue.size() >= BATCH_SIZE) {
flushBatch();
}
});
}
private void flushBatch() {
...
}
@Override
public void destroy() {
flushBatch();
}
}Так же, компоненты которые определены в дексрипторе, можно будет выключать из панели администрирования.
Инфо
Не нужно все компоненты указывать в дескрипторе. Если это вспомогательный компонент, то просто поставьте аннотацию @Component и он будет автоматически инстанцирован и внедрен по первому требованию.