private void handleAggregateInstanceEvent(String sagaType, String sagaId, Message message, String aggregateType, String aggregateId, String eventType) { System.out.println("Got handleAggregateInstanceEvent: " + message + ", type=" + sagaType + ", instance=" + sagaId); SagaInstanceData<Data> sagaInstanceAndData = sagaInstanceRepository.findWithData(sagaType, sagaId); SagaInstance sagaInstance = sagaInstanceAndData.getSagaInstance(); Data sagaData = sagaInstanceAndData.getSagaData(); String currentState = sagaInstance.getStateName(); logger.info("Current state={}", currentState); Optional<SagaEventHandler<Data>> eventHandler = getStateDefinition().findEventHandler(saga, currentState, sagaData, aggregateType, Long.parseLong(aggregateId), eventType); if (!eventHandler.isPresent()) { logger.error("No event handler for: {}", message); return; } logger.info("Invoking event handler for {}", message); SagaActions<Data> actions = eventHandler.get().getAction().apply(sagaData, new DomainEventEnvelopeImpl<>(null, null, null, null, null)); // TOOD // TODO - doesn't this do something??? Commands sagaInstance.setSerializedSagaData(SagaDataSerde.serializeSagaData(sagaData)); sagaInstanceRepository.update(sagaInstance); }
@Override public void update(SagaInstance sagaInstance) { logger.info("Updating {} {}", sagaInstance.getSagaType(), sagaInstance.getId()); int count = jdbcTemplate.update(updateSagaInstanceSql, sagaInstance.getStateName(), sagaInstance.getLastRequestId(), sagaInstance.getSerializedSagaData().getSagaDataType(), sagaInstance.getSerializedSagaData().getSagaDataJSON(), sagaInstance.getSagaType(), sagaInstance.getId()); Assert.isTrue(count == 1, "Should be 1 : " + count); saveDestinationsAndResources(sagaInstance); }
@Override public void update(SagaInstance sagaInstance) { logger.info("Updating {} {}", sagaInstance.getSagaType(), sagaInstance.getId()); int count = jdbcTemplate.update(updateSagaInstanceSql, sagaInstance.getStateName(), sagaInstance.getLastRequestId(), sagaInstance.getSerializedSagaData().getSagaDataType(), sagaInstance.getSerializedSagaData().getSagaDataJSON(), sagaInstance.getSagaType(), sagaInstance.getId()); Assert.isTrue(count == 1, "Should be 1 : " + count); saveDestinationsAndResources(sagaInstance); }
private void handleReply(Message message) { if (!isReplyForThisSagaType(message)) return; logger.debug("Handle reply: {}", message); String sagaId = message.getRequiredHeader(SagaReplyHeaders.REPLY_SAGA_ID); String sagaType = message.getRequiredHeader(SagaReplyHeaders.REPLY_SAGA_TYPE); SagaInstance sagaInstance = sagaInstanceRepository.find(sagaType, sagaId); Data sagaData = SagaDataSerde.deserializeSagaData(sagaInstance.getSerializedSagaData()); message.getHeader(SagaReplyHeaders.REPLY_LOCKED).ifPresent(lockedTarget -> { String destination = message.getRequiredHeader(CommandMessageHeaders.inReply(CommandMessageHeaders.DESTINATION)); sagaInstance.addDestinationsAndResources(singleton(new DestinationAndResource(destination, lockedTarget))); }); String currentState = sagaInstance.getStateName(); logger.info("Current state={}", currentState); SagaActions<Data> actions = getStateDefinition().handleReply(currentState, sagaData, message); logger.info("Handled reply. Sending commands {}", actions.getCommands()); processActions(sagaId, sagaInstance, sagaData, actions); }
@Override public void save(SagaInstance sagaInstance) { sagaInstance.setId(idGenerator.genId().asString()); logger.info("Saving {} {}", sagaInstance.getSagaType(), sagaInstance.getId()); jdbcTemplate.update(insertIntoSagaInstanceSql, sagaInstance.getSagaType(), sagaInstance.getId(), sagaInstance.getStateName(), sagaInstance.getLastRequestId(), sagaInstance.getSerializedSagaData().getSagaDataType(), sagaInstance.getSerializedSagaData().getSagaDataJSON()); saveDestinationsAndResources(sagaInstance); }
@Override public void save(SagaInstance sagaInstance) { sagaInstance.setId(idGenerator.genId().asString()); logger.info("Saving {} {}", sagaInstance.getSagaType(), sagaInstance.getId()); jdbcTemplate.update(insertIntoSagaInstanceSql, sagaInstance.getSagaType(), sagaInstance.getId(), sagaInstance.getStateName(), sagaInstance.getLastRequestId(), sagaInstance.getSerializedSagaData().getSagaDataType(), sagaInstance.getSerializedSagaData().getSagaDataJSON()); saveDestinationsAndResources(sagaInstance); }
@Override public SagaInstance create(Data sagaData, Optional<String> resource) { SagaInstance sagaInstance = new SagaInstance(getSagaType(), null, "????", null, SagaDataSerde.serializeSagaData(sagaData), new HashSet<>()); sagaInstanceRepository.save(sagaInstance); String sagaId = sagaInstance.getId(); resource.ifPresent( r -> Assert.isTrue(sagaLockManager.claimLock(getSagaType(), sagaId, r), "Cannot claim lock for resource")); SagaActions<Data> actions = getStateDefinition().getStartingHandler().get().apply(sagaData); List<CommandWithDestination> commands = actions.getCommands(); sagaData = actions.getUpdatedSagaData().orElse(sagaData); sagaInstance.setLastRequestId(sendCommands(sagaId, commands)); sagaInstance.setSerializedSagaData(SagaDataSerde.serializeSagaData(sagaData)); publishEvents(sagaId, actions.getEventsToPublish(), actions.getUpdatedState()); Optional<String> possibleNewState = actions.getUpdatedState(); maybeUpdateState(sagaInstance, possibleNewState); maybePerformEndStateActions(sagaId, sagaInstance, possibleNewState); sagaInstanceRepository.update(sagaInstance); updateEnlistedAggregates(sagaId, actions.getEnlistedAggregates()); updateEventInstanceSubscriptions(sagaData, sagaId, sagaInstance.getStateName()); return sagaInstance; }
}); String currentState = sagaInstance.getStateName(); updateEnlistedAggregates(sagaId, actions.getEnlistedAggregates()); sagaInstance.setLastRequestId(sendCommands(sagaId, commands)); updateEventInstanceSubscriptions(sagaData, sagaId, sagaInstance.getStateName());
private void assertSagaInstanceEquals(SagaInstance expectedSagaInstance, SagaInstance sagaInstance) { assertEquals(expectedSagaInstance.getSagaType(), sagaInstance.getSagaType()); assertEquals(expectedSagaInstance.getId(), sagaInstance.getId()); assertEquals(expectedSagaInstance.getStateName(), sagaInstance.getStateName()); assertEquals(expectedSagaInstance.getLastRequestId(), sagaInstance.getLastRequestId()); assertEquals(expectedSagaInstance.getSerializedSagaData().getSagaDataType(), sagaInstance.getSerializedSagaData().getSagaDataType()); assertEquals(expectedSagaInstance.getSerializedSagaData().getSagaDataJSON(), sagaInstance .getSerializedSagaData().getSagaDataJSON()); }