Events published from interceptor stored in eventstore?

Hello,
I have following interceptor

public class CommandInitializerHandlerInterceptor<T extends Message<?>> implements MessageHandlerInterceptor<T> {

   private static final Logger logger = LoggerFactory.getLogger(CommandInitializerHandlerInterceptor.class);

   private EventBus eventBus;

   @Autowired
   public void setEventBus(EventBus eventBus) {
      this.eventBus = eventBus;
   }

   @Override
   public Object handle(UnitOfWork<? extends T> unitOfWork, InterceptorChain interceptorChain) throws Exception {
      T message = unitOfWork.getMessage();
      EventMessage event = new GenericEventMessage<>(new CommandInitializedEvent(message.getPayload(), message.getPayloadType().getTypeName()));
      event.withMetaData(message.getMetaData());
      try {
         eventBus.publish(event);
      } catch (Throwable e) {
         logger.error("Unable to publish event", e);
      }
      return interceptorChain.proceed();
   }
}

It’s purpose is to catch Command and publis event with it’s data. But with this functionality it looks like the evenstore is trying to persist this event. Is this the default behaviour to persist all events published from within interceptors? Is there way how to disable this?

2017-01-10 12:44:28.407 INFO 1 — [axon-cmd-exec-3] o.a.c.gateway.IntervalRetryScheduler : Processing of Command [CreateAccountCommand] resulted in an exception and will not be retried.

org.axonframework.eventsourcing.eventstore.EventStoreException: An event with identifier [e960af35-4b49-447a-964c-2be17d887c59] could not be persisted

at org.axonframework.eventsourcing.eventstore.AbstractEventStorageEngine.handlePersistenceException(AbstractEventStorageEngine.java:112)

at org.axonframework.eventsourcing.eventstore.jpa.JpaEventStorageEngine.appendEvents(JpaEventStorageEngine.java:223)

at org.axonframework.eventsourcing.eventstore.AbstractEventStorageEngine.appendEvents(AbstractEventStorageEngine.java:85)

at org.axonframework.eventsourcing.eventstore.AbstractEventStore.prepareCommit(AbstractEventStore.java:63)

at org.axonframework.eventhandling.AbstractEventBus.doWithEvents(AbstractEventBus.java:181)

at org.axonframework.eventhandling.AbstractEventBus.lambda$null$5(AbstractEventBus.java:133)

at org.axonframework.messaging.unitofwork.MessageProcessingContext.notifyHandlers(MessageProcessingContext.java:68)

at org.axonframework.messaging.unitofwork.DefaultUnitOfWork.notifyHandlers(DefaultUnitOfWork.java:91)

at org.axonframework.messaging.unitofwork.AbstractUnitOfWork.changePhase(AbstractUnitOfWork.java:214)

at org.axonframework.messaging.unitofwork.AbstractUnitOfWork.commitAsRoot(AbstractUnitOfWork.java:83)

at org.axonframework.messaging.unitofwork.AbstractUnitOfWork.commit(AbstractUnitOfWork.java:71)

at org.axonframework.messaging.unitofwork.DefaultUnitOfWork.executeWithResult(DefaultUnitOfWork.java:80)

at org.axonframework.commandhandling.SimpleCommandBus.doDispatch(SimpleCommandBus.java:145)

at org.axonframework.commandhandling.SimpleCommandBus.doDispatch(SimpleCommandBus.java:118)

at org.axonframework.commandhandling.AsynchronousCommandBus.access$001(AsynchronousCommandBus.java:40)

at org.axonframework.commandhandling.AsynchronousCommandBus$DispatchCommand.run(AsynchronousCommandBus.java:94)

at org.springframework.security.concurrent.DelegatingSecurityContextRunnable.run(DelegatingSecurityContextRunnable.java:83)

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:1142)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

at java.lang.Thread.run(Thread.java:745)

Caused by: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement

at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1692)

at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1602)

at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1608)

at org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:1303)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:298)

at com.sun.proxy.$Proxy170.flush(Unknown Source)

at org.axonframework.eventsourcing.eventstore.jpa.JpaEventStorageEngine.appendEvents(JpaEventStorageEngine.java:220)

… 22 common frames omitted

Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement

at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:112)

at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)

at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109)

at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:95)

at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:207)

at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:45)

at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2897)

at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3397)

at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:89)

at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:582)

at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:456)

at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337)

at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)

at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1282)

at org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:1300)

… 29 common frames omitted

Caused by: org.postgresql.util.PSQLException: ERROR: null value in column “type” violates not-null constraint

Detail: Failing row contains (3, e960af35-4b49-447a-964c-2be17d887c59, 0, null, e960af35-4b49-447a-964c-2be17d887c59, null, cloud.api.infrastructure.command.initializer.event.C…, 2017-01-10T12:44:28.355Z, \x3c6d6574612d646174613e3c656e7472793e3c737472696e673e7472616365…, \x3c6e65742e646f6375636f6d2e636c6f75642e6170692e696e667261737472…).

at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2455)

at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2155)

at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:288)

at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:430)

at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:356)

at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:168)

at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:135)

at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:204)

… 39 common frames omitted

Hi,

you could subclass or wrap the event storage engine to only forward calls to storeEvents() for event messages that implement DomainEventMessage. If you remove the “normal” EventMessages from there, then you don’t store those events. Publication of the events to local processors will still happen. Note that Tracking Processors will not receive the Events that you don’t store.

Cheers,

Allard