我们有一个在功能强大的多核服务器上运行的导入程序。但是,我们的Apache Camel路由是单线程的,这很遗憾。
我们的[骆驼]进口商是单实例程序。如何使特定路由使用多个线程处理消息?消息是原子的,并已由bean处理,该bean已经以线程安全的方式进行了处理。 如果能够在线程中处理批处理(maxMessagesPerPoll)并在下一次轮询之前有空闲时间,我已经很高兴了(毕竟,这比顺序处理要好)。
这是我想做多线程的路线之一:
public void onConfigure() throws Exception {
// This is a JPA query which selects all unprocessed modules
String query = RouteQueryHelper.selectNextUnprocessedStaged(ImportAction.IMPORT_MODULES);
from("jpa:com.so.importer.entity.ModuleStageEntity" +
"?consumer.query=" + query +
"&maxMessagesPerPoll=2000" +
"&consumeLockEntity=false" +
"&consumer.delay=1000" +
"&consumeDelete=false")
.transacted().policy("CAMEL_DEFAULT_POLICY")
.bean(moduleImportService) // processes the entity and updates it's status flag
.to("log:import-module?groupInterval=10000")
.routeId("so.route.import-module");
}
该路线具有consumeDelete=false
,因为我们改为在实体上使用status属性(已修改并保存)。 consumer.query
也尊重status属性。
我们在Java 8的春季启动(1.3.8.RELEASE)中使用骆驼2.17.1版本。
编辑2019年1月21日:实体上具有@Consumed的方法,该方法在处理完实体后将其推入下一路线:
@Consumed
public void gotoNextStatus() {
switch (stageStatus) {
case STAGED: setStageStatus(StageStatus.IMPORTED); break;
case IMPORTED: setStageStatus(StageStatus.RENDERED); break;
case RENDERED: setStageStatus(StageStatus.DONE); break;
}
}
答案 0 :(得分:1)
您可以通过将消息发送到中间SEDA端点来引入一些异步:
comma
然后将实际处理放入具有N个并发SEDA使用方的默认路由中(默认值为1):
from("jpa:")
...
.to("seda:intermediateStage")