路由中未显示Apache Camel默认事务管理器数据

时间:2014-09-03 17:20:34

标签: java spring hibernate transactions apache-camel

我在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不会返回状态。

我不明白为什么。

0 个答案:

没有答案