如何在JPA骆驼路线内使用多线程

时间:2019-01-14 15:08:46

标签: apache-camel

我们有一个在功能强大的多核服务器上运行的导入程序。但是,我们的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;
    }
}

1 个答案:

答案 0 :(得分:1)

您可以通过将消息发送到中间SEDA端点来引入一些异步:

comma

然后将实际处理放入具有N个并发SEDA使用方的默认路由中(默认值为1):

from("jpa:")
...
.to("seda:intermediateStage")