Hi team,
How do you use MonitorCallbacks? I’ve set up a callback on my EventStore, but the code isn’t being executed. What am I missing?
`
@Bean (name = “eventBus”)
public EmbeddedEventStore eventStore(EventStorageEngine storageEngine, AxonConfiguration configuration) {
MultiMessageMonitor<EventMessage<?>> multiMessageMonitor = new MultiMessageMonitor<>(
configuration.messageMonitor(EventStore.class, “eventStore”),
message -> new MessageMonitor.MonitorCallback() {
private Logger LOGGER = LoggerFactory.getLogger(“rmb.foundery.zcd-eventBus.MessageMonitor”);
@Override
public void reportSuccess() {
LOGGER.trace("{} {} handled successfully", message.getPayloadType(), message.getIdentifier());
}
@Override
public void reportFailure(Throwable cause) {
LOGGER.error(String.format("%s %s failed", message.getPayloadType(), message.getIdentifier()), cause);
}
@Override
public void reportIgnored() {
LOGGER.info("{} {} ignored", message.getPayloadType(), message.getIdentifier());
}
});
EmbeddedEventStore eventStore = new EmbeddedEventStore(storageEngine, multiMessageMonitor);
eventStore.registerDispatchInterceptor(new EventLoggingInterceptor());
return eventStore;
}
`
Full story: In some instances my saga isn’t being triggered, and I’m trying to trace the reason.
Thanks
allardbz
(Allard Buijze)
August 30, 2017, 1:02pm
2
Hi Niel,
you should use the Configurer class to configure it. The Configurer is available as a Spring bean, so you an do something like:
@Autowired
public void configure(Configurer configurer) {
configurer.configureMessageMonitor(…)
}
Alternatively, you can explicitly create certain components, and pass the monitor as a constructor argument.
Hope this helps.
Cheers,
Allard
Thanks Allard, that worked.
Why could I not configure the EventStore explicitly, as you said and as I tried with the configuration in my original post?
In case anyone comes here with the same problem, here is how I am able to monitor each event:
I created a dummy event handler in order to create an EventProcessor (written in kotlin):
`
package com.example.monitoring
import org.axonframework.eventhandling.EventHandler
import org.axonframework.eventhandling.EventMessage
import org.springframework.stereotype.Component
@Component
class MessageMonitoringComponent {
@EventHandler
fun allEventMessage(message: EventMessage) {
// Creates an event processor with name “com.example.monitoring”
}
}
`
I added the MessageMonitor using the Configurer interface:
`
@Autowired
public void configure(Configurer configurer) {
MessageMonitor<Message<?>> monitor = message -> new MessageMonitor.MonitorCallback() {
private Logger LOGGER = LoggerFactory.getLogger(“com.example.monitoring.MessageMonitor”);
@Override
public void reportSuccess() {
LOGGER.trace("{} {} handled successfully", message.getPayloadType().getSimpleName(), message.getIdentifier());
}
@Override
public void reportFailure(Throwable cause) {
LOGGER.error(String.format("%s %s failed", message.getPayloadType().getSimpleName(), message.getIdentifier()), cause);
}
@Override
public void reportIgnored() {
LOGGER.info("{} {} ignored", message.getPayloadType().getSimpleName(), message.getIdentifier());
}
};
configurer.configureMessageMonitor(configuration -> (type, name) -> {
if (EventProcessor.class.isAssignableFrom(type) && name.equals(“com.example.monitoring”)) {
return monitor;
} else {
return NoOpMessageMonitor.instance();
}
});
}
`
allardbz
(Allard Buijze)
August 31, 2017, 7:40pm
5
Hi,
thanks for sharing that.
I’ve filed an issue (/improvement) to improve the API on the Configurer, to allow configuration of a MessageMonitor for a specific component.
Cheers,
Allard