独立 Spring 引导集成 Java 项目

Standalone Spring Boot Integration Java Project

我正在尝试构建一个独立的 Spring 集成应用程序,该应用程序具有基于入站 RabbitMQ 的网关。由于应用程序不需要处理 HTTP 请求,我想让它成为一个 运行nable Java 项目(使用 java -jar 可以很简单 运行 )。我在经历了 Spring Batch Guide example 之后借用了这个想法 :-

Make the application executable

Although batch processing can be embedded in web apps and WAR files, the simpler approach demonstrated below creates a standalone application. You package everything in a single, executable JAR file, driven by a good old Java main() method.

问题 1

我应该如何启动我的 Spring 启动应用程序? Spring 启动 Java 应用程序必须 运行 无休止地直到中断。

问题 2

排除网络项目性质。 目前我正在尝试使用 :-

@SpringBootApplication(exclude = { WebMvcAutoConfiguration.class,
    EmbeddedServletContainerAutoConfiguration.class,
    DispatcherServletAutoConfiguration.class,
    EmbeddedWebApplicationContext.class })
// THESE excludes are not helping. !!!
public class MyIntegrationApplication {

    public static void main(String[] args) throws InterruptedException {            
        System.exit(SpringApplication.exit(SpringApplication.run(
                DelinquencyEngineApplication.class, args)));
    }
}

因为我的类路径有 Spring Web MVC jar(间接通过 spring-boot-starter-integration 依赖项),尝试 运行 以上主要方法导致此执行:-

Exception in thread "main" org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:133)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:476)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
    at com.hcentive.wfm.delinquency.DelinquencyEngineApplication.main(DelinquencyEngineApplication.java:27)
Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.java:183)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:156)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130)
    ... 7 more

如何才能完全排除web项目性质?在@SpringBootApplication 上尝试了一些排除,但没有帮助。

问题 3

我应该如何处理正常关机? 当有人杀死 Java 应用程序时,我的应用程序不应该突然结束。

Spring 使用 Boot 1.2.3。

谢谢。

问题 1

spring 引导应用程序将 运行 直到您停止它。这是一个标准的 java 应用程序。您可以 运行 使用 java 命令

java -jar target/mymodule-0.0.1-SNAPSHOT.jar

主要问题是包装。看看 :

问题 2

要排除网络性质,您应该使用 SpringApplicationBuilder 生成器

new SpringApplicationBuilder(Application.class).web(false).run(args);

问题 3

在控制台模式下 CTRL+C 将正常关闭。在守护进程模式下,Maven App 汇编程序插件(嵌入 JSW)将输出带有 start/stop 的 shell 脚本。 正如 Gary 所建议的,参见 Spring Integration Documentation about orderly shutdown