1

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 がこれらのテーブルからデータを削除するだけなのでしょうか?

4

1 に答える 1