我们有一个侦听事件的微服务,现在让我们调用这个AuditService
。它侦听RabbitMQ上的审计事件(AuditEvent
)。任何想要调用AuditService
的人都需要创建并激发AuditEvent
。我们在一个公共模块中共享了AuditEvent
pojo,因此可以共享它。
Listen for AuditEvent
|
v
Trigger AuditEvent event handler
|
v
Validate audit event and process it
|
v
Save it to the database
|
v
If save is successful then send AuditPublishEvent to queue via AuditPublishCommand
注意,最后一部分需要是同步的,这意味着如果数据库保存失败,我们不想发送电子邮件或类似的东西。目前,这是通过从AuditService
中的事件处理程序中调用commandGateway来完成的,从EventListener
调用commandGateway是否正确,如果不正确,可以选择什么?
问题是,这是使用Axon框架和Spring的正确方法/最佳实践吗?
这是否是解决问题的最佳方法还很难说,因为它需要更多关于您的域的信息。我能说的是,你的所作所为在技术上是正确的。您提到,您不确定在存储AuditEvent
之后发布的事件是否仅在提交数据库更改时发布。这取决于事件的发布方式。如果您使用EventBus发布它并使用SpringAMQPPublisher,那么您是安全的。如果你直接发布,可能就不是这样了。
Axon使用unitOfWork来协调if处理的不同阶段的活动。处理程序在“started”阶段调用。数据库提交在以下阶段完成:'commit'。如果您想要确保在提交之后将消息发送到AMQP,请在afterCommit阶段注册一个处理程序。回滚时不调用此阶段的处理程序。您可以将UnitOfWork作为参数添加到@EventHandler annoted方法中。Axon会自动为你注射。
我知道java中的关键字“synchronized”是用于多线程的。然而,副本不是多线程的,而是多进程的。我说的对吗?有什么想法吗?
事务如何在带有Spring DSL的骆驼路由中工作,并且其中一条路由抛出异常? 如果routeB抛出异常,将如何将异常传播回RouteA。 如果在routeB中抛出异常,我可以看到正在处理异常并回滚事务。 我的骆驼路由定义:
问题内容: 是否有一个跟踪用户某些事件的表。 总是有一个动作,之后可能会有一个动作。 现在,我想查询这两个动作之间的时间差,以获取用户和之间的time_diff 。 现在,您可以假定没有多个条目(例如,至少一个,最大另一个)。 我想要这样的结果: 问题答案: 您可以使用以下查询: 该子句过滤掉仅包含一个动作的组,例如OP中的with记录。 演示在这里
根据我的理解,当数据库事务跨越微服务时,我们可以通过使用message-broker(kafka、RabbitMQ等)通过发布事件来解决这个问题,这样订阅者微服务就可以通过监听这些事件来更新他们的数据库。 在异常情况下,我们可以发送故障事件,以便订阅服务器服务更新它们的状态。 我们真的需要事件来源吗?
问题内容: 我们遇到了适用于多线程的方案。 在主线程中,执行一些逻辑操作并更新数据库,在某种程度上,它将调用另一个服务来更新数据库,该服务在另一个线程中运行。 我们希望两个线程共享同一个事务,这意味着任何一个线程中的任何一个操作都将失败,那么另一个线程中的该操作也将被回滚。 但是工作了几天,我发现一些帖子说JTA不支持多线程。当前我们使用Bitronix作为JTA提供者,有没有人知道Bitroni
我有一个java服务器应用程序,可以通过与多个客户端通信。在这个通道上,客户端发送请求,服务器发送应答。现在我想添加一个功能,服务器可以将文件发送到客户端。我不想通过用于通信的套接字发送,所以在一个客户端和一个服务器之间使用更多套接字是个好主意吗?如果是,如何处理?我用过这样的东西吗? 还是有更好的办法?