Java 在路由中看不到Apache Camel默认事务管理器数据
我在阿帕奇骆驼有两条路线。我通过Hibernate使用Spring3和JPA注释 我有多个数据源,并通过SpringTransactionPolicy将Apache Camel配置为使用一个默认TransactionManager 我使用DAO保存数据,并且可以通过实际查找数据来查看测试类中的数据。然后,我在apachecamel处理器中使用相同的DAO来查找相同的数据,但找不到数据。我不明白为什么在测试类中可以找到数据,而当我试图在ApacheCamel定制处理器中查找数据时,却找不到数据 下面是示例代码:Java 在路由中看不到Apache Camel默认事务管理器数据,java,spring,hibernate,transactions,apache-camel,Java,Spring,Hibernate,Transactions,Apache Camel,我在阿帕奇骆驼有两条路线。我通过Hibernate使用Spring3和JPA注释 我有多个数据源,并通过SpringTransactionPolicy将Apache Camel配置为使用一个默认TransactionManager 我使用DAO保存数据,并且可以通过实际查找数据来查看测试类中的数据。然后,我在apachecamel处理器中使用相同的DAO来查找相同的数据,但找不到数据。我不明白为什么在测试类中可以找到数据,而当我试图在ApacheCamel定制处理器中查找数据时,却找不到数据 下
public class Config {
@Autowired
private TransactionManagerConfig transactionManagerConfig;
@Bean
public SpringTransactionPolicy defaultTransactionPolicy() throws Exception {
SpringTransactionPolicy transactionPolicy = new SpringTransactionPolicy();
transactionPolicy.setTransactionManager((PlatformTransactionManager) transactionManagerConfig.transactionManager());
return transactionPolicy;
}
}
public class CustomRouter extends SpringRouteBuilder {
public void configure() throws Exception {
ApplicationContext applicationContext = getApplicationContext();
from("someSource")).transacted().unmarshal().jaxb("com.sample.processor.entities").convertBodyTo(Entity.class).to("direct:x")
.end();
from("direct:x").transacted().process((CustomProcessor) applicationContext.getBean("customProcessor")).to(someSource);
}
}
public class CustomProcessor implements org.apache.camel.Processor {
@Resource
private StatusDAO statusDAO;
public CustomProcessor(StatusDAO statusDAO) {
this.statusDAO = statusDAO;
}
public void process(Exchange exchange) throws Exception {
Status status = null;
Message message = exchange.getIn();
Entity entity = (Entity) message.getBody();
if(entity.getId() != null) {
// find by id
status = statusDAO.findById(id);
}
status.setName("someName");
messageStatusDAO.update(status);
message.setBody(messageStatus);
exchange.setOut(message);
}
}
数据在系统内以XML形式接收并更改为实体类。我使用statusDAO.findById()查找数据,此时即使实体存在,DAO也不会返回任何数据
我设置测试如下:
@Transactional
@TransactionalConfiguration(defaultRollback = true)
public class CustomTest {
@Transactional
@Before
public void setup throws Exception {
// setup the Status entity and save it using the DAO
}
@Test
public void testSomething() {
Status status = statusDAO.findById("id"); // returns the Status that was saved
MockEndpoint mockEndpoint = (MockEndpoint) this.context.getEndpoint(someDestination);
mockEndpoint.expectedMessageCount(1);
Status status = producerTemplate.requestBody(source, someXML, Status.class);
assertNotNull(status);
mockEndpoint.assertIsSatisfied();
}
}
在自定义处理器中使用相同的事务管理器和相同的statusDAO不会返回状态
我不明白为什么。在您的配置中,“someSource”是文件位置吗?另外,您在测试类中的“源”设置在哪里(以及要设置什么)?本例中的someSource是active mq队列,测试类中的源是activemq,目标是另一个队列。然后假设队列中有要使用的消息,我只能建议看一下代理在Camel中是如何配置的?不确定是否清楚。数据已经保存在数据库中,在CustomProcessor中获取相同数据的想法。这与代理有什么关系?据我所知,您正在DB和Camel之间使用ActiveMQ(JMS代理)——如果ActiveMQ处理了您的消息,则Camel不会接收其输出。