Using MessageMonitor.MonitorCallback

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

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:

  1. 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”
}
}

`

  1. 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();
}
});
}

`

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