我们需要将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>
请确认理解是否正确。此外,还有以下问题
对于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发送失败,我如何回滚保存发票状态?这属于分布式事务管理。这里涉及哪些交易案例。谢谢