@Override public <Data> SagaInstanceData<Data> findWithData(String sagaType, String sagaId) { SagaInstance sagaInstance = find(sagaType, sagaId); Data sagaData = SagaDataSerde.deserializeSagaData(sagaInstance.getSerializedSagaData()); return new SagaInstanceData<>(sagaInstance, sagaData); }
private void updateEventInstanceSubscriptions(Data sagaData, String sagaId, String stateName) { List<EventClassAndAggregateId> instanceEvents = getStateDefinition().findEventHandlers(saga, stateName, sagaData); aggregateInstanceSubscriptionsDAO.update(getSagaType(), sagaId, instanceEvents); }
private void processActions(String sagaId, SagaInstance sagaInstance, Data sagaData, SagaActions<Data> actions) { String lastRequestId = sagaCommandProducer.sendCommands(this.getSagaType(), sagaId, actions.getCommands(), this.makeSagaReplyChannel()); sagaInstance.setLastRequestId(lastRequestId); actions.getUpdatedState().ifPresent(sagaInstance::setStateName); sagaInstance.setSerializedSagaData(SagaDataSerde.serializeSagaData(actions.getUpdatedSagaData().orElse(sagaData))); if (actions.isEndState()) { performEndStateActions(sagaId, sagaInstance, actions.isCompensating(), 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); }
private SagaActions<TestSagaData> makeSecondSagaActions(boolean compensating) { return SagaActions.<TestSagaData>builder() .withCommand(commandForParticipant2) .withUpdatedState("state-B") .withUpdatedSagaData(sagaDataUpdatedByReplyHandler) .withIsEndState(true) .withIsCompensating(compensating) .build(); }
private SagaActions<TestSagaData> makeFirstSagaActions() { return SagaActions.<TestSagaData>builder() .withUpdatedSagaData(sagaDataUpdatedByStartingHandler) .withCommand(commandForParticipant1).withUpdatedState("state-A").build(); }
private void performEndStateActions(String sagaId, SagaInstance sagaInstance, boolean compensating, Data sagaData) { for (DestinationAndResource dr : sagaInstance.getDestinationsAndResources()) { Map<String, String> headers = new HashMap<>(); headers.put(SagaCommandHeaders.SAGA_ID, sagaId); headers.put(SagaCommandHeaders.SAGA_TYPE, getSagaType()); // FTGO SagaCommandHandler failed without this but the OrdersAndCustomersIntegrationTest was fine?!? commandProducer.send(dr.getDestination(), dr.getResource(), new SagaUnlockCommand(), makeSagaReplyChannel(), headers); } if (compensating) saga.onSagaRolledBack(sagaId, sagaData); else saga.onSagaCompletedSuccessfully(sagaId, sagaData); }
private void maybePerformEndStateActions(String sagaId, SagaInstance sagaInstance, Optional<String> possibleNewState) { possibleNewState.ifPresent(newState -> { if (getStateDefinition().isEndState(newState)) { performEndStateActions(sagaId, sagaInstance); } }); }
@Override public void save(SagaInstance sagaInstance) { sagaInstance.setId(SAGA_ID); this.sagaInstance = sagaInstance; }
@Override protected SagaInstanceRepositoryJdbc getSagaInstanceRepositoryJdbc() { return new SagaInstanceRepositoryJdbc(); }
public static <Data> SagaEventHandler make(Class<DomainEvent> eventClass, Function<Data, Long> aggregateIdProvider, SagaStateMachineAction<Data, DomainEventEnvelope<DomainEvent>> eventHandler) { return new SagaEventHandler<Data>(eventClass, aggregateIdProvider, eventHandler); }
private String getSagaType() { return saga.getSagaType(); }
private String makeSagaReplyChannel() { return getSagaType() + "-reply"; }
private boolean isDuplicateReply(String messageId, String sagaType, String sagaId) { String consumerId = makeConsumerIdFor(sagaType, sagaId); return false; }
public SagaActions<Data> build() { return new SagaActions<>(commands, updatedSagaData, updatedState, endState, compensating); }
public static <Data> Builder<Data> builder() { return new Builder<>(); }
private boolean sagaInstanceEquals(SagaInstance expectedSagaInstanceAfterFirstStep, SagaInstance sagaInstance) { assertSagaInstanceEquals(expectedSagaInstanceAfterFirstStep, sagaInstance); return true; }
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()); }
public static <Data> SagaEventHandler make(Class<DomainEvent> eventClass, Function<Data, Long> aggregateIdProvider, SagaStateMachineAction<Data, DomainEventEnvelope<DomainEvent>> eventHandler) { return new SagaEventHandler<Data>(eventClass, aggregateIdProvider, eventHandler); }
private String getSagaType() { return saga.getSagaType(); }