Apache camel Apache camel如何测试回滚场景
我有一个通用的消息路由器,它的路由在运行时由不同的路由生成器根据一些配置创建 配置以XML形式存储,当加载到内存中时,它将转换为Apache camel Apache camel如何测试回滚场景,apache-camel,Apache Camel,我有一个通用的消息路由器,它的路由在运行时由不同的路由生成器根据一些配置创建 配置以XML形式存储,当加载到内存中时,它将转换为RouteConfig域对象,通过其getter公开如何构建路由。这样的RouteConfig将定义getFromUri()、getDestinations()、getDeadLetterUri()、IsTransact()等方法 此类管线生成器的示例如下所示: public class NonTransactedRouteBuilder extends Abstrac
RouteConfig
域对象,通过其getter公开如何构建路由。这样的RouteConfig
将定义getFromUri()、getDestinations()、getDeadLetterUri()、IsTransact()等方法
此类管线生成器的示例如下所示:
public class NonTransactedRouteBuilder extends AbstractRouteBuilder {
@Override
protected void buildRoute(String endPoint, RouteConfig routeConfig) {
RouteBean routeBean = getRouteBean(routeConfig.getBean());
final String[] destinations = routeConfig.getDestinations();
from(endPoint).routeId(createRouteId())
.autoStartup(false)
.threads(routeConfig.getThreads())
.filter(body().isNotNull())
.process((Processor) routeBean)
.filter(body().isNotNull())
.choice()
.when(header("dead.letter").isNotNull())
.to(getDeadLetterUri())
.otherwise()
.loadBalance().random()
.to(destinations)
.endChoice();
}
}
以上只是一个示例,让您了解我们构建的路线类型。唯一相关的一件事是路线没有交易。现在,为了进行单元测试,我们扩展了CamelTestSupport的TestNG风格,并传递了一个模拟RouteConfig实例,该实例将导致一个路由被配置为在一个direct:test
和两个mock:test1
和mock:test2
端点之间移动消息。路由bean中有一些逻辑,根据消息内容,它可以帮助我们进行所有测试场景:
@Test
public void shouldDiscardNullMessages() throws Exception {
...
}
@Test
public void shouldDiscardScamMessages() throws Exception {
...
}
@Test
public void shouldRouteMessageToDeadLetterQueue() throws Exception {
...
}
@Test(timeOut = 1000)
public void shouldRouteMessagesInALoadBalancedWay()
...
}
一切都很好,我们很高兴我们可以进行代码更改并立即进行测试。然而,我们的大多数路线建设者将建立交易路线。从我们的集成和端到端测试中,我们知道事务处理功能可以很好地工作,但是如果能够在代码更改点使用单元测试来测试它,那就更好了
所以我的问题是:
使用与上述相同的路由,只需一个autoStartup(false).transaction()
更改,这将是在发件人direct:test
端点中获取消息的一种方式,因此我们也可以介绍这部分功能。我们会很高兴与任何工作周围的建议,只是为了证明这方面的工作
提前感谢您的投入
更新1:
我尝试过的一件事是使用注入了模拟jta事务管理器的TransactionErrorHandler
配置我的测试骆驼上下文。有点像bleow:
@Test
public void shouldBeAbleToRollback() throws Exception {
TransactionErrorHandlerBuilder errorHandlerBuilder = new TransactionErrorHandlerBuilder();
errorHandlerBuilder.setTransactionManager(jtaTransactionManagerMock);
context().setErrorHandlerBuilder(errorHandlerBuilder);
template.sendBody(FROM_1, "rollback message");
...
}
然后我希望能够捕获一个jtaTransactionManagerMock.rollback()
,但这并没有发生。Wat将是不工作的原因
更新2:
由于无法实现上述目标,我退后一步,开始在单元测试中将ActiveMQ集成为事务性资源,一切正常。实际上,我们的路由还包括文件和数据库端点,但为了单元测试的目的,仅使用JMS资源的通用队列生成器就足够了。我没有意识到,如果你整天都在处理WebSphere MQ manager,你需要创建和配置MQ manager,而且你必须已经有了队列,并且必须为此构建所有繁重的基础设施,那么这会有多么容易。ActiveMQ做得非常好
然而,我仍然对是否有办法嘲笑这种跨国行为感兴趣