Акка: отслеживаемые бревна - PullRequest
1 голос
/ 22 июня 2019

Я использую Akka с Java. Я хочу знать, есть ли лучшая практика / шаблон для отслеживания сценариев с регистрацией в среде Akka?

Вот очень простой сценарий:

  1. Источник Device субъект отправляет status сообщение субъекту Propagator;
  2. Актер Propagator направляет сообщение status своим слушателям (другим Device актерам);
  3. Каждый слушатель (Device) отправляет сообщение ack субъекту Propagator.

Базовые требования:

  1. Каждый сценарий запуска должен быть различим в журналах.
  2. Идентификатор сценария-инициатора (здесь идентификатор устройства) должен быть представлен во всех журналах.

Какой совет по добавлению в требования? Может быть, имя класса исходного сообщения!?

Мой подход заключается в размещении отслеживаемой информации в MDC логгера: 1) введение интерфейса для маркировки сообщений и 2) абстрактный класс в качестве базового класса для всех участников:

1- Traceable, который реализуется всеми (связанными) классами сообщений:

public interface Traceable {

    String traceId(); // An unique id (UUID) in each scenario (Req#1)

    int deviceId(); // Device which initiated the scenario (Req#2)

}

2- AbstractActorWithLogging как базовый класс всех актеров, который помещает отслеживаемую информацию в MDC логгера:

public abstract class AbstractActorWithLogging extends AbstractActor {

    protected final DiagnosticLoggingAdapter logger = Logging.getLogger(this);

    @Override
    public void aroundReceive(PartialFunction<Object, BoxedUnit> receive, Object msg) {
        try {
            if (msg instanceof Traceable) logger.setMDC(extractMdc(((Traceable) msg)));
            if (logger.isDebugEnabled()) logger.debug("Received: {}.", msg);
            super.aroundReceive(receive, msg);
            if (logger.isDebugEnabled()) logger.debug("Processed: {}.", msg);
        } finally {
            logger.clearMDC();
        }
    }

    protected Map<String, Object> extractMdc(Traceable traceable) {
        Map<String, Object> mdc = new HashMap<>();
        mdc.put("traceId", traceable.traceId());
        mdc.put("deviceId", traceable.deviceId());
        return mdc;
    }
}
...