【发布时间】:2021-05-18 13:37:09
【问题描述】:
我目前正在将 Axon Framework 与 Axon Server 一起用于我的基于事件的微服务应用程序。最近遇到需要等待 saga 完全完成并将其执行结果(成功或错误)返回给客户端,我通过 before dispatch 命令创建订阅查询解决了这个问题触发锁定的 saga,然后等待从 saga 分派的更新并将结果返回给客户端。
现在,这在向客户报告 saga 完成状态方面很有用,但现在我偶然发现了另一个看似相关的问题。每次客户查询我们系统的 API 时,我们都会执行客户帐户的存在性检查——我们通过在执行任何业务逻辑之前调度相应的查询来做到这一点。在我介绍了订阅查询之后,当客户端收到有关 saga 完成状态的响应时,他们立即向我们发送查询以获取某些实体的更新列表,但是检查帐户是否存在的查询失败并返回 org.axonframework.queryhandling.NoHandlerForQueryException: No handler for query: ...尽管肯定有一个为其注册的处理程序,并且它只是在客户端的先前请求期间处理完全相同的命令,但在发送时由 Axon 服务器发送。这在我将内部订阅查询机制添加到等式后开始发生。
如果我们稍后重复完全相同的查询或在调用之间设置几百毫秒的延迟,此错误就会消失,但这肯定不是解决方案 - 如果我们的客户开始同时发送大量请求怎么办?发生帐户检查查询?当订阅未关闭时,我们是否无法处理某种类型的查询?我关闭了从SubscriptionQueryResult 返回的Mono 的doFinally 上的订阅,但是当下一个查询到达时,它是否有可能在 Axon Server 中实际上并没有关闭?或者,我认为更接近事实,我需要以某种方式调整 Axon Server 的查询处理能力?恕我直言,文档在这个主题上相当简洁,尤其是关于查询,而不是事件/命令。
【问题讨论】:
-
能否包含一个代码 sn-p,说明如何订阅订阅查询并在之后发送查询?
标签: axon