我总是需要一个带有 Spring 集成的 Web 服务器吗?

Posted

技术标签:

【中文标题】我总是需要一个带有 Spring 集成的 Web 服务器吗?【英文标题】:Do I always need a web server with spring integration? 【发布时间】:2021-11-11 07:09:19 【问题描述】:

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

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

现在每个批次的配置如下:

@SpringBootApplication
@EnableBatchProcessing
public class Batch1Application 

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

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

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

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

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

现在我想转到 spring-integration。我发现了几篇关于 spring-integrationspring-batch-intergartion 的文章/视频,但它们都使用相同的网络应用程序来使用简单的 @ 启动作业987654326@(因为上下文包含所有需要的 bean)。


我的问题是如何让每批都监听消息,然后开始执行?

我需要将它们全部转换为网络应用程序并在它们上添加 spring-integration 吗?

【问题讨论】:

不,您不需要 Web 服务器来使用 Spring Integration,您的应用程序也不需要是 Web 应用程序。您可以拥有任何类型的 Java 应用程序,将某些内容放在 Spring Integration 通道上,让它做它需要做的事情。例如,将某些内容放入通道不一定需要从 Spring MVC 控制器中完成。 如果不需要服务器,我的批处理(jvm)如何监听传入的消息?目前,每个批次都在单独的 jvm(进程)中运行,并在完成后立即关闭 【参考方案1】:

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

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

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

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

另外,既然你说你现在可以写一些脚本,听起来一切都是在同一台主机上完成的,所以你可以利用 ZeroMQ 作为 Web APP 和那些工作人员之间的协议:@987654322 @

【讨论】:

谢谢你的回答,我现在看得更清楚了

以上是关于我总是需要一个带有 Spring 集成的 Web 服务器吗?的主要内容,如果未能解决你的问题,请参考以下文章

(二十四)Struts2 Spring集成

使用 Spring Boot 进行 Kotlin 集成测试

Spring Boot 和 Nginx 集成

嵌入式 Jetty 环境中的 Spring Boot 和 Spring Security 集成

使用 CSRF 进行放心和基本身份验证的集成测试

Spring与其他Web框架集成