我的问题非常接近这个讨论:https://issues.apache.org/jira/browse/CAMEL-4863 . 我也被直接的同步行为 grab 了 .
我设计了这样一个应用程序:
Route1:from(direct:step1-in).process(...) . to(direct:step1-out)
Route2:from(direct:step2-in).process(...) . to(direct:step2-out)
CoreRoute(连接所有步骤):from(direct:step1-out).to(direct:step2-in)
一年后,我仍然喜欢这种方法 . 我可以单独实现和测试这些步骤,例如切换到seda:step1-out如果我需要解耦它们 .
但seda相当重要的解耦方法:创建一个队列和一个具有固定线程数的线程池 . 因此,即使您大多数时间需要1个线程,有时需要100个线程,您仍然可以使用100个线程 .
有时你只想释放当前的线程,因为它应该让我们说已经解压缩下一个文件,而不是处理当前的 .
从我理解的文档中你将使用线程(1,100):
从 . (直接:输入一览处理器).split(主体())的螺纹(1100).delay(1000).process(...)到(步过程解压出)
但是这个 will block 线程将交换路由到直接输入列表处理器,直到所有线程完成处理 .
相反,我希望将交换复制到后续线程并完成当前交换 .
1 回答
感谢Claus的评论,我想出了以下内容,似乎按照我的想法使用 wireTap :
我认为这是要走的路 . 虽然我很困惑,因为Camel in Action书中建议:10.4.3异步调用者使用多个线程
这是最明显的方法,但正如此处所述:http://camel.apache.org/seda.html它不是可行的方式,因为它可以结束,建议使用direct而不是seda的替代方案对我不起作用,因此问题 . 此外,seda方式具有无限队列,这是一个潜在的"memory leak",因此每次要使用此模式时都需要决定并设置合适的大小 .
@Claus非常感谢你的出色工作!你的答案在我的项目中引导了我很多 . 如果您认为这是一个很好的解决方案,或者我仍然遗漏了某些东西,您可以澄清一下 . 我看到的唯一“缺点”是将创建一个新的交易所,一个交易也不会跨越多个处理步骤 .
此日志显示了wireTap异步工作的解决方案,并以灵活的方式进行扩展