MessageHandlerInvocationException suppressing the root cause Exception?

Hi!

We have a NPE when handling Events and get the following stacktrace:

`
org.axonframework.messaging.annotation.MessageHandlerInvocationException:
Error handling event of type [class
de.lvm.serviceprozesse.zaehlwerk.domain.api.events.MitarbeiterEntsperrtEvent]
in aggregate
at
org.axonframework.commandhandling.model.inspection.AnnotatedAggregateMetaModelFactory$AnnotatedAggregateModel.lambda$doPublish$7(AnnotatedAggregateMetaModelFactory.java:223)
at java.util.Optional.ifPresent(Optional.java:159)
at
org.axonframework.commandhandling.model.inspection.AnnotatedAggregateMetaModelFactory$AnnotatedAggregateModel.doPublish(AnnotatedAggregateMetaModelFactory.java:218)
at
org.axonframework.commandhandling.model.inspection.AnnotatedAggregateMetaModelFactory$AnnotatedAggregateModel.publish(AnnotatedAggregateMetaModelFactory.java:213)
at
org.axonframework.commandhandling.model.inspection.AnnotatedAggregate.publish(AnnotatedAggregate.java:200)
at
org.axonframework.eventsourcing.EventSourcedAggregate.publish(EventSourcedAggregate.java:158)
at
org.axonframework.commandhandling.model.inspection.AnnotatedAggregate.doApply(AnnotatedAggregate.java:234)
at
org.axonframework.eventsourcing.EventSourcedAggregate.doApply(EventSourcedAggregate.java:148)
at
org.axonframework.commandhandling.model.AggregateLifecycle.apply(AggregateLifecycle.java:67)
at
de.lvm.serviceprozesse.zaehlwerk.domain.api.VerteilOrganisation.mitarbeiterEntsperren(VerteilOrganisation.java:766)
at
de.lvm.serviceprozesse.zaehlwerk.domain.internal.commandhandler.VerteilOrganisationCommandHandler.lambda$null$32(VerteilOrganisationCommandHandler.java:341)
at
org.axonframework.commandhandling.model.inspection.AnnotatedAggregate.lambda$execute$2(AnnotatedAggregate.java:174)
at
org.axonframework.commandhandling.model.AggregateLifecycle.lambda$execute$3(AggregateLifecycle.java:199)
at
org.axonframework.commandhandling.model.AggregateLifecycle.executeWithResult(AggregateLifecycle.java:166)
at
org.axonframework.commandhandling.model.AggregateLifecycle.execute(AggregateLifecycle.java:198)
at
org.axonframework.commandhandling.model.inspection.AnnotatedAggregate.execute(AnnotatedAggregate.java:174)
at
org.axonframework.commandhandling.model.LockAwareAggregate.execute(LockAwareAggregate.java:92)
at
de.lvm.serviceprozesse.zaehlwerk.domain.internal.commandhandler.VerteilOrganisationCommandHandler.lambda$handle$33(VerteilOrganisationCommandHandler.java:340)
at
de.lvm.serviceprozesse.zaehlwerk.domain.internal.commandhandler.VerteilOrganisationCommandHandler.exceptionBarrier(VerteilOrganisationCommandHandler.java:588)
at
de.lvm.serviceprozesse.zaehlwerk.domain.internal.commandhandler.VerteilOrganisationCommandHandler.handle(VerteilOrganisationCommandHandler.java:337)
at sun.reflect.GeneratedMethodAccessor194.invoke(Unknown Source)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at
org.axonframework.messaging.annotation.AnnotatedMessageHandlingMember.handle(AnnotatedMessageHandlingMember.java:127)
at
org.axonframework.messaging.annotation.WrappedMessageHandlingMember.handle(WrappedMessageHandlingMember.java:61)
at
org.axonframework.commandhandling.AnnotationCommandHandlerAdapter.handle(AnnotationCommandHandlerAdapter.java:97)
at
org.axonframework.commandhandling.AnnotationCommandHandlerAdapter.handle(AnnotationCommandHandlerAdapter.java:41)
at sun.reflect.GeneratedMethodAccessor186.invoke(Unknown Source)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at
org.axonframework.spring.config.AbstractAnnotationHandlerBeanPostProcessor$AdapterIntroductionInterceptor.invoke(AbstractAnnotationHandlerBeanPostProcessor.java:252)
at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at
org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)
at
de.lvm.serviceprozesse.zaehlwerk.domain.internal.commandhandler.VerteilOrganisationCommandHandler$$EnhancerBySpringCGLIB$$ff278d74.handle()
at
org.axonframework.messaging.DefaultInterceptorChain.proceed(DefaultInterceptorChain.java:57)
at
org.axonframework.messaging.interceptors.CorrelationDataInterceptor.handle(CorrelationDataInterceptor.java:55)
at
org.axonframework.messaging.DefaultInterceptorChain.proceed(DefaultInterceptorChain.java:55)
at
org.axonframework.messaging.unitofwork.DefaultUnitOfWork.executeWithResult(DefaultUnitOfWork.java:69)
at
org.axonframework.commandhandling.SimpleCommandBus.handle(SimpleCommandBus.java:156)
at
org.axonframework.commandhandling.SimpleCommandBus.doDispatch(SimpleCommandBus.java:127)
at
org.axonframework.commandhandling.SimpleCommandBus.dispatch(SimpleCommandBus.java:91)
at
org.axonframework.commandhandling.gateway.RetryingCallback$RetryDispatch.run(RetryingCallback.java:116)
at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException: null

`

The root cause is printed as the exception message only:

Caused by: java.lang.NullPointerException: null`

`

Therefore it’s very hard to find the real cause of this NPE :-/.

Does someone knows this problem? Does Axon suppresses something here?
We are using logback for logging. So from that side the stacktrace output should be fine.

I was able to shed some light on this:

The missing Stacktrace is removed by the jvm. And that is due to the axon retry behaviour.
That retries are happening so fast, so that the jvm removes the trace due to performance reasons.

You can disable this “feature” bei setting the jvm-switch:
-XX:-OmitStackTraceInFastThrow.

Have a look here:
https://stackoverflow.com/questions/25843823/how-can-an-exception-be-created-thrown-with-no-stack-trace

So the real question is - can we slow down the retry mechanism of axon?

Assuming you use the IntervalRetryScheduler and not some custom implementation of the RetryScheduler, set a value for the interval. It is in milliseconds and it looks like it has an implicit default of 0 so that probably explains why they were happening so fast.

HTH,
Thomas