java - 具有多个资源(数据库和 JMS 代理)的事务

标签 java spring transactions activemq

我有一个应用程序,我们将其插入数据库并将事件发布到 ActiveMQ。

我遇到交易问题。我将用下面的代码解释这个问题:

@Transactional(rollbackFor = Exception.class)
public class ProcessInvoice {

    public boolean insertInvoice(Object obj){

        /* Some processing logic here */

        /* DB Insert */
        insert(obj);

        /* Some processing logic here again */

        /* Send event to Queue 1 */
        sendEvent(obj);

        /* Send event to Queue 2 */
        sendEvent(obj);

        return true;
    }
}

类用@Transactional注释,在insertInvoice方法中我正在做一些处理,插入到数据库,并将事件发送到两个队列。

使用上面的代码我面临两个问题:

  1. 如果队列很慢,那么我将面临性能问题,因为 sendEvent 方法中的进程需要时间。

  2. 如果由于某种原因 ActiveMQ 宕机或者消费者无法处理消息,如何回滚事务?

如何处理这些问题?

最佳答案

如果您需要以事务方式发送消息(即,您需要确保代理在您发送消息时确实收到了您的消息)并且代理执行缓慢,这会影响您的应用程序,那么您只有两个选择:

  1. 接受应用程序的性能损失。
  2. 提高代理的性能,以便您的应用程序性能也得到提高。提高经纪商绩效完全是另一个主题。

在 JMS(以及大多数其他消息传递架构)中,生产者和消费者在设计上并不了解彼此。因此,您将不知道您发送的消息的使用者是否因任何原因而无法处理该消息,至少不能通过任何自动 JMS 机制处理该消息。

当代理关闭时,sendEvent 方法应该彻底失败。但是,我不太熟悉 Spring 如何处理事务,因此我无法说出在这方面应该发生什么。

关于java - 具有多个资源(数据库和 JMS 代理)的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58128852/

相关文章:

spring - @Qualifier 中的 SpEL 引用同一个 bean

spring - 从 Spring 框架开始

java - Spring-MVC 最佳实践 : Why put transactions on services rather than DAOs?

php - 如何检测MySQL存储过程中的回滚?

Java JDBC 结果集已关闭

java - 将依赖注入(inject)与 Apache Commons IO 结合使用

java - Spring MVC : POST and PUT not working

java - Scala - 非法的 base64 字符 5c

java - Lucene 的近实时搜索实现

transactions - 我应该在以太坊上有多少个确认?