private String payloadContentType(Object event) { String simpleName; if (EventMessage.class.isInstance(event)) { simpleName = ((EventMessage) event).getPayload().getClass().getName(); } else { simpleName = event.getClass().getName(); } return simpleName; }
/** * Converts the given Axon {@code eventMessage} to a Spring ApplicationEvent. This method may be overridden to * change the translation. * <p> * The default implementation creates a {@link PayloadApplicationEvent} with the Message's payload. * <p> * If this method returns {@code null}, no message is published * * @param eventMessage The EventMessage to transform * @return the Spring ApplicationEvent representing the Axon EventMessage */ protected ApplicationEvent convert(EventMessage<?> eventMessage) { return new PayloadApplicationEvent<>(messageSource, eventMessage.getPayload()); }
@Override public ResultValidator<T> expectEvents(Object... expectedEvents) { if (expectedEvents.length != publishedEvents.size()) { reporter.reportWrongEvent(publishedEvents, Arrays.asList(expectedEvents), actualException); } Iterator<EventMessage<?>> iterator = publishedEvents.iterator(); for (Object expectedEvent : expectedEvents) { EventMessage actualEvent = iterator.next(); if (!verifyPayloadEquality(expectedEvent, actualEvent.getPayload())) { reporter.reportWrongEvent(publishedEvents, Arrays.asList(expectedEvents), actualException); } } return this; }
/** * Finds the association property value in the message's payload. */ @Override @SuppressWarnings("unchecked") public <T> Object resolve(String associationPropertyName, EventMessage<?> message, MessageHandlingMember<T> handler) { return getProperty(associationPropertyName, handler).getValue(message.getPayload()); }
@Override public <T> Message<T> convertToOutboundMessage(EventMessage<T> event) { Map<String, Object> headers = new HashMap<>(); event.getMetaData().forEach(headers::put); headers.put(MESSAGE_ID, event.getIdentifier()); if (event instanceof DomainEventMessage) { headers.put(AGGREGATE_ID, ((DomainEventMessage) event).getAggregateIdentifier()); headers.put(AGGREGATE_SEQ, ((DomainEventMessage) event).getSequenceNumber()); headers.put(AGGREGATE_TYPE, ((DomainEventMessage) event).getType()); } return new GenericMessage<>(event.getPayload(), new SettableTimestampMessageHeaders(headers, event.getTimestamp().toEpochMilli())); }
@Override public JobDataMap toJobData(Object event) { JobDataMap jobData = new JobDataMap(); EventMessage eventMessage = (EventMessage) event; jobData.put(MESSAGE_ID, eventMessage.getIdentifier()); jobData.put(MESSAGE_TIMESTAMP, eventMessage.getTimestamp().toEpochMilli()); SerializedObject<byte[]> serializedPayload = serializer.serialize(eventMessage.getPayload(), byte[].class); jobData.put(SERIALIZED_MESSAGE_PAYLOAD, serializedPayload.getData()); jobData.put(MESSAGE_TYPE, serializedPayload.getType().getName()); jobData.put(MESSAGE_REVISION, serializedPayload.getType().getRevision()); SerializedObject<byte[]> serializedMetaData = serializer.serialize(eventMessage.getMetaData(), byte[].class); jobData.put(MESSAGE_METADATA, serializedMetaData.getData()); return jobData; }
/** * Creates a new message for the scheduled event. This ensures that a new identifier and timestamp will always * be generated, so that the timestamp will reflect the actual moment the trigger occurred. * * @param event The actual event (either a payload or an entire message) to create the message from * @return the message to publish */ private EventMessage<?> createMessage(Object event) { EventMessage<?> eventMessage; if (event instanceof EventMessage) { eventMessage = new GenericEventMessage<>(((EventMessage) event).getPayload(), ((EventMessage) event).getMetaData()); } else { eventMessage = new GenericEventMessage<>(event, MetaData.emptyInstance()); } return eventMessage; } }
/** * Creates a new message for the scheduled event. This ensures that a new identifier and timestamp will always * be generated, so that the timestamp will reflect the actual moment the trigger occurred. * * @return the message to publish */ private EventMessage<?> createMessage() { EventMessage<?> eventMessage; if (event instanceof EventMessage) { eventMessage = new GenericEventMessage<>(((EventMessage) event).getPayload(), ((EventMessage) event).getMetaData()); } else { eventMessage = new GenericEventMessage<>(event, MetaData.emptyInstance()); } return eventMessage; } }
private EventMessage<Object> timeCorrectedEventMessage(Object event) { EventMessage<?> msg = GenericEventMessage.asEventMessage(event); return new GenericEventMessage<>(msg.getIdentifier(), msg.getPayload(), msg.getMetaData(), currentTime()); }
@SuppressWarnings("unchecked") @Test public void testInterceptorWithChainProceeding() { commandGateway.sendAndWait(asCommandMessage(new CreateMyAggregateCommand("id"))); commandGateway.sendAndWait(asCommandMessage(new ClearMyAggregateStateCommand("id", true))); ArgumentCaptor<EventMessage<?>> eventCaptor = ArgumentCaptor.forClass(EventMessage.class); verify(eventStore, times(3)).publish(eventCaptor.capture()); assertEquals(new MyAggregateCreatedEvent("id"), eventCaptor.getAllValues().get(0).getPayload()); assertEquals(new AnyCommandInterceptedEvent(ClearMyAggregateStateCommand.class.getName()), eventCaptor.getAllValues().get(1).getPayload()); assertEquals(new MyAggregateStateClearedEvent("id"), eventCaptor.getAllValues().get(2).getPayload()); }
@SuppressWarnings("unchecked") @Test public void testInterceptorWithNestedEntity() { commandGateway.sendAndWait(asCommandMessage(new CreateMyAggregateCommand("id"))); commandGateway.sendAndWait(asCommandMessage(new MyNestedCommand("id", "state"))); ArgumentCaptor<EventMessage<?>> eventCaptor = ArgumentCaptor.forClass(EventMessage.class); verify(eventStore, times(4)).publish(eventCaptor.capture()); assertEquals(new MyAggregateCreatedEvent("id"), eventCaptor.getAllValues().get(0).getPayload()); assertEquals(new AnyCommandMatchingPatternInterceptedEvent(MyNestedCommand.class.getName()), eventCaptor.getAllValues().get(1).getPayload()); assertEquals(new AnyCommandInterceptedEvent(MyNestedCommand.class.getName()), eventCaptor.getAllValues().get(2).getPayload()); assertEquals(new MyNestedEvent("id", "state intercepted"), eventCaptor.getAllValues().get(3).getPayload()); }
@SuppressWarnings("unchecked") @Test public void testInterceptorWithNestedNestedEntity() { commandGateway.sendAndWait(asCommandMessage(new CreateMyAggregateCommand("id"))); commandGateway.sendAndWait(asCommandMessage(new MyNestedNestedCommand("id", "state"))); ArgumentCaptor<EventMessage<?>> eventCaptor = ArgumentCaptor.forClass(EventMessage.class); verify(eventStore, times(6)).publish(eventCaptor.capture()); assertEquals(new MyAggregateCreatedEvent("id"), eventCaptor.getAllValues().get(0).getPayload()); assertEquals(new AnyCommandMatchingPatternInterceptedEvent(MyNestedNestedCommand.class.getName()), eventCaptor.getAllValues().get(1).getPayload()); assertEquals(new AnyCommandInterceptedEvent(MyNestedNestedCommand.class.getName()), eventCaptor.getAllValues().get(2).getPayload()); assertEquals(new AnyCommandInterceptedEvent("StaticNestedNested" + MyNestedNestedCommand.class.getName()), eventCaptor.getAllValues().get(3).getPayload()); assertEquals(new AnyCommandInterceptedEvent("NestedNested" + MyNestedNestedCommand.class.getName()), eventCaptor.getAllValues().get(4).getPayload()); assertEquals(new MyNestedNestedEvent("id", "state parent intercepted intercepted"), eventCaptor.getAllValues().get(5).getPayload()); }
@SuppressWarnings("unchecked") @Test public void testInterceptorWithoutChainProceeding() { commandGateway.sendAndWait(asCommandMessage(new CreateMyAggregateCommand("id"))); commandGateway.sendAndWait(asCommandMessage(new ClearMyAggregateStateCommand("id", false))); ArgumentCaptor<EventMessage<?>> eventCaptor = ArgumentCaptor.forClass(EventMessage.class); verify(eventStore, times(2)).publish(eventCaptor.capture()); assertEquals(new MyAggregateCreatedEvent("id"), eventCaptor.getAllValues().get(0).getPayload()); assertEquals(new MyAggregateStateNotClearedEvent("id"), eventCaptor.getAllValues().get(1).getPayload()); }
@SuppressWarnings("unchecked") @Test public void testInterceptor() { commandGateway.sendAndWait(asCommandMessage(new CreateMyAggregateCommand("id"))); String result = commandGateway .sendAndWait(asCommandMessage(new UpdateMyAggregateStateCommand("id", "state"))); ArgumentCaptor<EventMessage<?>> eventCaptor = ArgumentCaptor.forClass(EventMessage.class); verify(eventStore, times(3)).publish(eventCaptor.capture()); assertEquals(new MyAggregateCreatedEvent("id"), eventCaptor.getAllValues().get(0).getPayload()); assertEquals(new AnyCommandInterceptedEvent(UpdateMyAggregateStateCommand.class.getName()), eventCaptor.getAllValues().get(1).getPayload()); assertEquals(new MyAggregateStateUpdatedEvent("id", "state intercepted"), eventCaptor.getAllValues().get(2).getPayload()); assertEquals("aggregateUpdateResult", result); }
@SuppressWarnings("unchecked") @Test public void testInterceptorThrowingAnException() { commandGateway.sendAndWait(asCommandMessage(new CreateMyAggregateCommand("id"))); try { commandGateway.sendAndWait(asCommandMessage(new InterceptorThrowingCommand("id"))); fail("Expected exception"); } catch (InterceptorException e) { // we are expecting this } ArgumentCaptor<EventMessage<?>> eventCaptor = ArgumentCaptor.forClass(EventMessage.class); verify(eventStore, times(1)).publish(eventCaptor.capture()); assertEquals(new MyAggregateCreatedEvent("id"), eventCaptor.getAllValues().get(0).getPayload()); }
@Test public void testStoreAndLoadApplicationEvent() { testSubject.appendEvents(new GenericEventMessage<>("application event", MetaData.with("key", "value"))); assertEquals(1, testSubject.readEvents(null, false).count()); EventMessage<?> message = testSubject.readEvents(null, false).findFirst().get(); assertEquals("application event", message.getPayload()); assertEquals(MetaData.with("key", "value"), message.getMetaData()); }
@Before public void setUp() { EventStore eventStore = spy(EmbeddedEventStore.builder() .storageEngine(new InMemoryEventStorageEngine()) .build()); Configurer configurer = DefaultConfigurer.defaultConfiguration(); configurer.eventProcessing() .usingSubscribingEventProcessors() .registerSaga(MySaga.class); configuration = configurer.configureEventStore(c -> eventStore) .configureAggregate(MyAggregate.class) .registerComponent(DeadlineManager.class, this::buildDeadlineManager) .start(); published = new CopyOnWriteArrayList<>(); configuration.eventBus().subscribe(msgs -> msgs.forEach(msg -> published.add(msg.getPayload()))); }
EventMessageHandler eventHandler = event -> { DomainEventMessage domainEvent = (DomainEventMessage) event; if (event.getPayload() instanceof CounterChangedEvent) { CounterChangedEvent counterChangedEvent = (CounterChangedEvent) event.getPayload(); if (counterChangedEvent.getCounter() == 1) { commandBus.dispatch(asCommandMessage(new ChangeCounterCommand(domainEvent.getAggregateIdentifier(),
EventMessageHandler eventHandler = event -> { DomainEventMessage domainEvent = (DomainEventMessage) event; if (event.getPayload() instanceof CounterChangedEvent) { CounterChangedEvent counterChangedEvent = (CounterChangedEvent) event.getPayload(); if (counterChangedEvent.getCounter() == 1) { commandBus.dispatch(asCommandMessage(new ChangeCounterCommand(domainEvent.getAggregateIdentifier(),
/** * Finds the association property value in the message's payload. */ @Override @SuppressWarnings("unchecked") public <T> Object resolve(String associationPropertyName, EventMessage<?> message, MessageHandlingMember<T> handler) { return getProperty(associationPropertyName, handler).getValue(message.getPayload()); }