我为教育阿帕奇骆驼交易编写了此代码
from("jms:SAMPLE_1")
.transacted()
.log("message")
.to("jms:SAMPLE_2")
.to("jms:SAMPLE_3")
.log("message")
.process(exchange -> {
throw new Exception();
})
.end();
我在发生错误后使用事务处理,我必须触发事务回滚,但由于某种原因,消息保留在SAMPLE_2和SAMPLE_3队列中。为什么?
更新:
我添加了豆子
@Bean(name = "PROPAGATION_REQUIRED")
public SpringTransactionPolicy propogationRequired(PlatformTransactionManager jtaTransactionManager){
SpringTransactionPolicy propagationRequired = new SpringTransactionPolicy();
propagationRequired.setTransactionManager(jtaTransactionManager);
propagationRequired.setPropagationBehaviorName("PROPAGATION_REQUIRED");
return propagationRequired;
}
@Bean
PlatformTransactionManager platformTransactionManager(ConnectionFactory cf) {
return new JmsTransactionManager(cf);
}
并修复路线,但这对我没有帮助:
from("jms:SAMPLE_1")
.transacted("PROPAGATION_REQUIRED")
.log("message")
.to("jms:SAMPLE_2")
.to("jms:SAMPLE_3")
.log("message")
.process(exchange -> {
throw new Exception();
})
.end();
我在文档中找到了这个配置
<blueprint ...>
<bean id="jmstx" class="org.apache.camel.component.jms.JmsComponent">
<property name="configuration" ref="jmsConfig" />
</bean>
<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
<property name="connectionFactory" ref="jmsConnectionFactory" />
<property name="transactionManager" ref="jmsTransactionManager" />
<property name="transacted" value="true" />
</bean>
...
如何从这个xml创建bean?
是的,这不起作用,因为Camel JMS组件不知道您的事务管理器等。
正如您已经发现的,缺少组件配置。
我没有使用普通的JMS组件,而是使用ActiveMQ的专用版本,但它们非常相似。所以我希望你能从这个中得到缺失的bean。
@Bean(name = "activemq") // bean name is used in URI activemq:...
public ActiveMQComponent createComponent(ConnectionFactory factory) {
ActiveMQComponent activeMQComponent = new ActiveMQComponent();
activeMQComponent.setConnectionFactory(factory);
activeMQComponent.setLazyCreateTransactionManager(false);
activeMQComponent.setTransacted(true);
return activeMQComponent;
}
重要的
如您所见,我没有在组件中设置事务管理器。只要你只和一个经纪人交谈,你就不需要tx管理器的东西(然后你从缓存设置中获利)。使用单一经纪人的交易
transacted()
您只需要在Camel JMS组件上设置< code>setTransacted(true)和< code > setLazyCreateTransactionManager(false),然后所有JMS使用者都会被处理。
您也可以在Camel文档中找到这两种设置。
我在使用@Transactional注释进行事务回滚时遇到了一个问题。 我在backingbean、service和dao类中有以下方法:
我有一个由Spring框架维护的对象,我使用注释将它注入到我想要的任何DAO类中,如下所示。 我使用那些DAO类在数据库中保存如下内容。 现在,这里的两个DAO都使用了通过注入的相同的。现在,如果在之后发生异常,那么我甚至希望回滚保存的实体。但是,如何从中获取? 如果所有DAO都持有相同的对象,那么我可以直接调用类的方法吗?返回新事务或当前与关联的任何事务吗?
问题内容: 调用的方法: 1. Struts Action 2.服务类方法(由@Transactional注释) 3. Xfire Web服务调用 包括struts(DelegatingActionProxy)和事务在内的所有内容都使用Spring进行配置。 持久性是通过JPA / Hibernate完成的。 有时,Web服务将引发未经检查的异常。我捕获了此异常并抛出了一个已检查的异常。我不希望事
问题内容: 当服务中抛出RuntimeException时,我使用Grail的回滚功能将所有服务更新为事务性。在大多数情况下,我都这样做: 无论如何,我想验证这是否确实会回滚事务……这让我开始思考是否在这一点上已经提交了。此外,如果没有,设置flush:true会改变这一点吗?我对Spring / Hibernate如何完成所有这些工作不是很熟悉:) 问题答案: 是的,那样做。 默认情况下,Gra
null 通过函数注入到正在进行db操作的方法中进行monkey修补,并在测试中更改此函数 通过使sql全局化来更改猴子补丁-我不太喜欢 使数据库在测试时间内不允许删除操作 上面的每个选项似乎都不理想,我应该如何编写这个测试用例?
根据 的联机丛书文档,我得到的印象是,如果 T-SQL 语句引发运行时错误,则整个事务将终止并回滚: 当 SET XACT_ABORT 处于打开状态时,如果 Transact-SQL 语句引发运行时错误,则整个事务将终止并回滚。 在 SQL 服务器 2008 R2 中对此进行测试: 给出输出: 我还认为如果出现错误,<code>将XACT_ABORT设置为ON</code>会终止批处理: SET