为了更好地理解 ActiveMQ 和 Camel,我正在编写一个用于事务回滚的单元测试。它似乎对我不起作用,这意味着我做错了什么!这是代码:
public class MyTest extends CamelTestSupport {
@Override
protected JndiRegistry createRegistry() throws Exception {
JndiRegistry reg = super.createRegistry();
DataSourceTransactionManager txMgr = new DataSourceTransactionManager();
SpringTransactionPolicy txPolicy = new SpringTransactionPolicy();
txPolicy.setTransactionManager(txMgr);
txPolicy.setPropagationBehaviorName("PROPAGATION_REQUIRED");
reg.bind("required", txPolicy);
return reg;
}
@Before
public void setUp() throws Exception {
super.setUp();
}
@After
public void tearDown() throws Exception {
super.tearDown();
}
@Test
public void testTransaction() throws Exception {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");
context.addComponent("jms", JmsComponent.jmsComponentTransacted(connectionFactory));
context.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("jms:queue:in")
.transacted("required")
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
System.out.println("Expected failure");
throw new RuntimeException("Expected failure");
}
})
.to("mock:result");
}
});
context.start();
MockEndpoint result = context.getEndpoint("mock:result", MockEndpoint.class);
result.expectedMessageCount(0);
NotifyBuilder notifyBuilder = new NotifyBuilder(context).whenDone(1).create();
context.createProducerTemplate().sendBody("jms:queue:in", "Test");
boolean matches = notifyBuilder.matches(5, TimeUnit.SECONDS);
assertTrue(matches);
Thread.sleep(1000);
assertMockEndpointsSatisfied();
BrowsableEndpoint in = context.getEndpoint("jms:queue:in", BrowsableEndpoint.class);
List<Exchange> list = in.getExchanges();
assertEquals(1, list.size());
String body = list.get(0).getIn().getBody(String.class);
assertEquals("Test", body);
context.stop();
}
}
它在 list.size() 为 1 的断言上失败,如果回滚成功,它应该通过。我究竟做错了什么?提前致谢!