Skip to content

Компоненты

Для регистрации компонентов, которые должны быть инстанцированы при загрузке, зарегистрируйте их отдельно в дескрипторе

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 и он будет автоматически инстанцирован и внедрен по первому требованию.