java - 在 Spring Integration 中等待所有线程完成

标签 java multithreading spring spring-integration

我有一个严重依赖 Spring Integration 的自执行 jar 程序。我遇到的问题是 程序在其他 Spring bean 完全完成之前终止

以下是我正在使用的代码的精简版本,如果需要,我可以提供更多代码/配置。入口点是一个 main() 方法,它引导 Spring 并启动导入过程:

public static void main(String[] args) {
    ctx = new ClassPathXmlApplicationContext("flow.xml");
    DataImporter importer = (DataImporter)ctx.getBean("MyImporterBean");
    try {
        importer.startImport();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        ctx.close();
    }
}

DataImporter 包含一个简单的循环,可以将消息发送到 Spring Integration 网关。这为流提供了一种主动的“推送”方法,而不是轮询数据的常用方法。这就是我的问题所在:

public void startImport() throws Exception {
    for (Item item : items) {
        gatewayBean.publish(item);
        Thread.sleep(200); // Yield period
    }
}

为了完整起见,流 XML 看起来像这样:

<gateway default-request-channel="inChannel" service-interface="GatewayBean" />

<splitter input-channel="inChannel" output-channel="splitChannel" />

<payload-type-router input-channel="splitChannel">
    <mapping type="Item" channel="itemChannel" />
    <mapping type="SomeOtherItem" channel="anotherChannel" />
</payload-type-router>

<outbound-channel-adapter channel="itemChannel" ref="DAOBean" method="persist" />

流程有效地启动和处理项目,但是一旦 startImport() 循环完成,主线程就会终止并立即关闭所有 Spring Integration 线程。这会导致竞态条件,最后 (n) 项在程序终止时未完全处理。

我有一个想法,即维护我正在处理的项目的引用计数,但这被证明是相当复杂的,因为流程经常将消息拆分/路由到多个服务激活器 - 这意味着很难确定每个服务激活器是否项目已“完成”。

我认为我需要一些方法来检查是否没有 Spring bean 仍在执行,或者在终止之前标记发送到网关的所有项目都已完全处理。

我的问题是,我该如何解决其中任何一个问题,或者有没有更好的方法来解决我没有想到的问题?

最佳答案

您在这里没有使用请求-响应模式。

outbound-channel-adapter 是一个fire and forget action,如果你想等待响应,你应该使用一个等待响应的出站网关,并将响应连接到原始网关,然后在java中 sendAndReceive 不是刚刚发布。

关于java - 在 Spring Integration 中等待所有线程完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8924694/

相关文章:

java - Java 中的 TSV 解释器

C++ - std::thread 在执行时崩溃

c# - 使用 Visual Studio 调试器查看/诊断内存转储中的逻辑 .NET 线程

c# - 如何在另一个线程中调用方法?

java - 如何使用 Spring boot 将缓冲读取器注入(inject)到以文件读取器作为参数的类中?

java - 问题插入heapsort

Java:针对新手的 Java EE 平台很好的介绍

java - 我怎样才能让我的输出反向读取我的二进制数?

java - Web.xml(tomcat) 与 ApplicationContext.xml(spring) 哪个先加载?

java - 带有 c3p0 的 spring JPA 在第一次请求时连接超时