首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Saga条目表/Saga集合保持为空

Saga条目表/Saga集合保持为空
EN

Stack Overflow用户
提问于 2018-08-02 17:35:17
回答 1查看 683关注 0票数 1

我一直在关注AxonBank example,以便理解在Axon框架中实现Saga,并且有一些类似下面这样的代码来开始和结束saga

代码语言:javascript
复制
@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执行转账之后,所有这些代码都会执行,因为我可以看到我的日志被打印到控制台,所有交易都存储在account表中。

所有条目也存在于domain_event_entry中,但是无论事务是成功还是失败,saga_entry和association_value_entry表都保持为空。

最初,我认为这可能是因为saga存储配置错误,所以我使用MongoSagaStore配置了saga存储,但Saga的集合仍然是空的。

那么,是我在这里遗漏了什么,还是axon只是在传奇完成后从这些表中删除了数据?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-02 18:23:18

当Saga条目结束时,AxonFramework将自动从其存储中删除Saga条目,包括任何关联。因此,您只能在那里看到活动实例的信息。

在示例应用程序中,所有总线组件都使用"Simple...“实现,这基本上意味着所有活动都在同一个线程中执行。因此,一旦你收到OK或NotOK,传奇的所有活动也将结束。如果您要用异步或分布式实现来取代它们,情况就不再是这样了。在整个过程完成之前,将返回您的OK。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51650255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档