Axonフレームワークでの佐賀の実装を理解し、佐賀を開始および終了するためのこのようなコードを用意するために、私はAxonBankの例に従ってきました
@Saga
public class MoneyTransferSaga {
@Inject
private transient CommandGateway commandGateway;
private String targetAccount;
private String transferId;
@StartSaga
@SagaEventHandler(associationProperty = "transferId")
public void on(MoneyTransferRequestedEvent event) {
System.out.println("Inside start saga for money transfer event");
targetAccount = event.getTargetAccount();
transferId = event.getTransferId();
SagaLifecycle.associateWith("transactionId", transferId);
System.out.println("## These are the params going into WMC : sourceAccount: " + event.getSourceAccount()
+ " transferID: " + transferId + " event.getAmount: " + event.getAmount());
commandGateway.send(new WithdrawMoneyCommand(event.getSourceAccount(), transferId, event.getAmount()),
new CommandCallback<WithdrawMoneyCommand, Object>() {
@Override
public void onSuccess(CommandMessage<? extends WithdrawMoneyCommand> commandMessage,
Object result) {
}
@Override
public void onFailure(CommandMessage<? extends WithdrawMoneyCommand> commandMessage,
Throwable cause) {
System.out.println("On failure of withdraw money command inside saga ");
System.out.println("###################### Cause of failure = " + cause);
commandGateway.send(new CancelMoneyTransferCommand(event.getTransferId()));
}
});
}
@SagaEventHandler(associationProperty = "transactionId")
public void on(MoneyWithdrawnEvent event) {
System.out.println("Inside saga event handler for monney withdrawnevent");
commandGateway.send(new DepositMoneyCommand(targetAccount, event.getTransactionId(), event.getAmount()),
LoggingCallback.INSTANCE);
}
@SagaEventHandler(associationProperty = "transactionId")
public void on(MoneyDepositedEvent event) {
System.out.println("Inside saga event handler for money deposited event");
commandGateway.send(new CompleteMoneyTransferCommand(transferId), LoggingCallback.INSTANCE);
}
@EndSaga
@SagaEventHandler(associationProperty = "transferId")
public void on(MoneyTransferCompletedEvent event) {
System.out.println("Inside Endsaga for money transfer complete event");
}
@SagaEventHandler(associationProperty = "transferId")
public void on(MoneyTransferCancelledEvent event) {
end();
}
}
REST API を介して送金を実行した後、ログがコンソールに出力され、すべてのトランザクションがアカウント テーブルに保存されていることがわかるので、このコードはすべて実行されます。
domain_event_entry にもすべてのエントリが存在しますが、saga_entry および association_value_entry テーブルは、トランザクションが成功したか失敗したかに関係なく、空のままです。
最初は、これは saga ストアの構成ミスが原因である可能性があると考えていたので、saga ストアを構成しましMongoSagaStore
たが、それでも saga のコレクションは空のままです。
ここで何かが足りないのでしょうか、それともサガの完了後に axon がこれらのテーブルからデータを削除するだけなのでしょうか?