我在Apache Camel中有两条路线。我通过Hibernate使用Spring 3和JPA注释。
我有多个数据源,并已将Apache Camel配置为通过SpringTransactionPolicy使用一个默认的TransactionManager。
我使用DAO保存数据,可以通过实际查找数据来查看测试类中的数据。然后,我在Apache Camel Processor中使用相同的DAO来查找相同的数据,但找不到数据。我不明白为什么在测试类中可以找到数据,并且一旦我尝试查看Apache Camel自定义处理器,就无法找到数据。
以下是示例代码:
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接收并更改为Entity类。我在此时使用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不会返回状态。
我不明白为什么。