我是否总是需要具有 spring 集成的 Web 服务器?

Do I always need a web server with spring integration?

我是 spring-integration 的新手,我想要实现的是启动 spring-batch 来自外部 Web 应用程序的作业。

批次 运行 有两种不同的方式。 Cron(超出此问题的范围)并通过用户操作手动启动,如下图所示

现在每批配置如下:

@SpringBootApplication
@EnableBatchProcessing
public class Batch1Application {

    public static void main(String[] args) {
        new SpringApplicationBuilder(Batch1Application.class)
                .web(WebApplicationType.NONE)
                .registerShutdownHook(true)
                .run(args);
    }
}

当前,当网络应用程序收到一个操作时,它会调用 cron 配置中使用的相同 sh 脚本:

//...
ProcessBuilder processBuilder = new ProcessBuilder(List.of(/*path to batch-1-script.sh*/));
Process process = processBuilder.start();
//...

脚本执行如下操作:java -jar batch1.jar

它工作正常,每个应用程序的上下文不共享。

现在我想转到 spring-集成。我发现几个 articles/videos 谈论 spring-integrationspring-batch-intergartion , 但所有人都使用相同的网络应用程序来使用简单的 DirectChannel 启动作业(因为上下文包含所有需要的 bean)。


我的问题是如何让每个批处理监听即将到来的消息然后开始执行?

我是否需要将它们全部转换为 Web 应用程序并在其上添加 spring-集成

Spring 集成只是一个库,它完全不依赖于任何容器细节。如果您需要通过 HTTP 公开与您的应用程序的交互,那么您只需要在 Web 服务器上安装此应用程序。

从您的描述中不清楚 batch-1-script.sh 启动批处理应用程序的作用,但您可能可以使用此功能并更改其服务实现以向通道发送消息而不是直接发送消息现在的作业执行调用。

另一方面,您可以使用介于两者之间的任何消息传递代理并向主题发布消息,让这些应用程序在他们这边监听此类消息。

查看此解决方案的 Spring 集成中的可能端点:https://docs.spring.io/spring-integration/docs/current/reference/html/endpoint-summary.html#spring-integration-endpoints

此外,既然你说你现在可以编写一些脚本,听起来一切都在同一台主机上完成,所以你可能可以利用 ZeroMQ 作为 Web APP 和那些工作人员之间的协议: https://docs.spring.io/spring-integration/docs/current/reference/html/zeromq.html#zeromq