当前位置: 首页 > 知识库问答 >
问题:

同步JMS消息队列和JDBC事务-需要事务代理吗

龚承嗣
2023-03-14

我们需要将JMS队列中的消息持久化到事务中的数据库中,以确保在DB持久化期间抛出任何错误时不会确认JMS消息。基于此处提供的解决方案——使用消息驱动通道适配器时的事务处理

<int-jms:message-driven-channel-adapter id="jmsIn"
    transaction-manager="transactionManager"
    connection-factory="sConnectionFactory"
    destination-name="emsQueue"
    acknowledge="transacted" channel="jmsInChannel"/>

<int:channel id=" jmsInChannel " />

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
    <property name="url" value="jdbc:hsqldb:mem:testdb" />
</bean>

<!-- Transaction manager for a datasource -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
</bean>

    <bean id="sconnectionFactory"       class="org.springframework.jms.connection.TransactionAwareConnectionFactoryProxy">
        <property name="targetConnectionFactory">
            <bean class="project.TestConnectionFactory">

            </bean>
        </property>
        <property name="synchedLocalTransactionAllowed" value="true" />
    </bean>

请确认理解是否正确。此外,还有以下问题

  1. 在这种情况下是否需要TransactionAware ConnectionFactoryProxy
  2. JMS Queue和JDBC是两个独立的事务资源。如本例所示,将jdbc事务管理器注入JMS适配器是否等同于使用ChainedTransactionManager(链接JMS Transaction Mananger和JDBC事务管理器)

共有1个答案

慕光赫
2023-03-14

对于TransactionAware ConnectionFactoryProxy,请查阅其JavaDocs:

 * Proxy for a target CCI {@link javax.resource.cci.ConnectionFactory}, adding
 * awareness of Spring-managed transactions. Similar to a transactional JNDI
 * ConnectionFactory as provided by a Java EE server.
 *
 * <p>Data access code that should remain unaware of Spring's data access support
 * can work with this proxy to seamlessly participate in Spring-managed transactions.
 * Note that the transaction manager, for example the {@link CciLocalTransactionManager},
 * still needs to work with underlying ConnectionFactory, <i>not</i> with this proxy.

我不确定这与您关于JMS DB transaction的请求有什么关系,但我认为您应该担心transaction manager,它支持这两种事务资源。

为此,Spring建议对XA事务使用JtaTransactionManager。或者根据Dave Syer的文章,您可以考虑使用ChainedTransactionManager:http://www.javaworld.com/article/2077963/open-source-tools/distributed-transactions-in-spring--with-and-without-xa.html

使现代化

如果本地事务对您来说很好,您真的可以继续使用TransactionWareConnectionFactoryProxy及其同步本地事务降低true。当然,直接从

否则,您必须使用ChainedTransactionManager。这个解决方案确实比第一个基于TransactionAware ConnectionFactoryProxy的解决方案增加了一些开销。

 类似资料:
  • 问题内容: 我正在使用同时使用JMS和Hibernate的独立应用程序。 该文档建议,如果我想同时使用这两种资源进行事务处理,则必须使用JTA。 但是,现在使用带有@Transaction注释的DAO方法(和HibernateTransactionManager),这似乎已经可以工作。当我在JmsTemplate上调用send()时,消息不会立即发送,而是随着方法的返回,使用Hibernate会话

  • 本文向大家介绍学习spring事务与消息队列,包括了学习spring事务与消息队列的使用技巧和注意事项,需要的朋友参考一下 在开发过程中,遇到一个bug,产生bug的原因是spring事务提交晚于消息队列的生产消息,导致消息队列消费消息时获取到的数据不正确。这篇文章介绍问题的产生和一步步的解决过程。 一.问题的产生: 场景还原:接口中的一个方法,首先修改订单状态,然后向消息队列中生产消息,消息队列

  • 对于每个客户机,我们自然需要发送关于事务的反馈(OK或Exception->rollback)。 我的问题是:如果我使用,是否意味着只使用一个事务,如果第100个客户机遇到问题,第1个客户机的事务也会回滚?

  • 主要内容:提交和回滚,使用保存点如果JDBC连接处于自动提交模式,默认情况下,则每个SQL语句在完成后都会提交到数据库。 对于简单的应用程序可能没有问题,但是有三个原因需要考虑是否关闭自动提交并管理自己的事务 - 提高性能 保持业务流程的完整性 使用分布式事务 事务能够控制何时更改提交并应用于数据库。 它将单个SQL语句或一组SQL语句视为一个逻辑单元,如果任何语句失败,整个事务将失败。 要启用手动事务支持,而不是使用JDBC驱

  • 我可以在solace JMS队列中搜索任何特定的消息,然后在其他消息之前处理吗?我们有这样的功能w. r. t慰藉队列。

  • 我有一个获取发票的方法,它创建XML并将该XML发送到JMS队列,然后将发票保存到DB,更新状态为“invoinced”。下面是涉及Spring和Hibernate的伪代码。我的问题是:hibernate save rollsback Jms发送失败。或者,如果JMS发送失败,我如何回滚保存发票状态?这属于分布式事务管理。这里涉及哪些交易案例。谢谢