Я использую Akka с Java. Я хочу знать, есть ли лучшая практика / шаблон для отслеживания сценариев с регистрацией в среде Akka?
Вот очень простой сценарий:
- Источник
Device
субъект отправляет status
сообщение субъекту Propagator
;
- Актер
Propagator
направляет сообщение status
своим слушателям (другим Device
актерам);
- Каждый слушатель (
Device
) отправляет сообщение ack
субъекту Propagator
.
Базовые требования:
- Каждый сценарий запуска должен быть различим в журналах.
- Идентификатор сценария-инициатора (здесь идентификатор устройства) должен быть представлен во всех журналах.
Какой совет по добавлению в требования? Может быть, имя класса исходного сообщения!?
Мой подход заключается в размещении отслеживаемой информации в 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;
}
}