Spring Java 项目未启动 Tomcat 导入具有无限循环的 jar 时

Spring Java project not starting Tomcat when importing jar with infinite loop

我有一个 java 应用程序,它只是从另一个项目中获取一个 jar,该 jar 使用无限循环轮询有关 AWS SQS 主题的消息。

循环在我的客户端应用程序中查找用 @subscriber 注释的方法。

我有一个 bean,它将 return 一个 class 有一个注释的方法。 当我删除使用注释方法调用 class 的 bean 时,我的 tomcat 在端口上启动。当我再次添加它时,没有托管端口。

在 pom 文件中,我添加了这两个依赖项(以及其他一些依赖项,但这些应该是相关的)

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

我的主要 class 看起来像这样

@SpringBootApplication
@ComponentScan(basePackages = {"com.mypackage.reuse", "com.mypackage.sample.subscriber"})
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

我启动应用程序时获得的日志

2020-03-12 14:32:56.228  INFO 2429 --- [           main] c.l.g.e.f.sample.subscriber.Application  : The following profiles are active: development
2020-03-12 14:32:57.580  INFO 2429 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 1339 (http)
2020-03-12 14:32:57.586  INFO 2429 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-03-12 14:32:57.587  INFO 2429 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.29]
2020-03-12 14:32:57.650  INFO 2429 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2020-03-12 14:32:57.651  INFO 2429 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1363 ms
2020-03-12 14:32:58.038  INFO 2429 --- [           main] org.reflections.Reflections              : Reflections took 111 ms to scan 2 urls, producing 23 keys and 53 values 

在那之后没有日志,我希望有这样的东西,如果我删除循环,我会得到这样的东西。当我删除循环时,我得到类似下面的内容,但问题是我需要循环连续轮询。

Exposing 2 endpoint(s) beneath base path '/actuator'
Tomcat started on port(s): 1339 (http) with context path ''

您使用 application.properties 文件覆盖了默认的 Tomcat HTTP 端口,这就是为什么您看不到它从 8080 开始的原因:

server:
  port: 1339

改为

server:
  port: 8080

或完全删除它以获得默认配置

由于没有报错,

Spring boot 可能会做一些事情,这可能需要一些时间...当应用程序上下文初始化完成后 spring boot finally writes "tomcat started on port 1339 message"

我不知道 "reflections API to find methods annotated with @subscirber" 时到底发生了什么,但如果实施效率低下 - 这肯定需要一些时间。

因此,我建议进行线程转储,并在日志中到达您认为应用程序卡住的位置时尝试分析 运行ning 线程。

另一个可疑点是你写的:

When I remove the bean that is calling a class with an annotation method my tomcat is started on a port.

这个bean到底是什么?带注释方法的class是什么?它会尝试连接到 AWS 吗?如果是这样,如果定义错误并且尝试连接时卡住了怎么办?同样,堆栈跟踪将在这里澄清很多事情。

更新

Threas 转储(您应该从下往上阅读它 - 它显示了当前调用执行 chsin)显示在 SubscriberFactory 的构造函数中您尝试连接到 Aws 的 SQS 并且它被卡住了...

这是不正常的情况。可能您在连接参数方面做错了什么。

从spring初始化的角度来看,它卡住了整个初始化过程,因为spring在一个线程中一个接一个地创建bean

无论如何,正确连接到 sqs 可能会解决问题。

更新 2

回答 运行在不同线程中绑定 bean 的问题。

你不是 运行 bean,而是 bean 中的方法。

它不应该是用@PostConstruct注释的构造函数或方法,因为这些是spring在初始化期间调用的方法

您可以在侦听器中使用 @Async 方法,当应用程序准备就绪时,它将 运行 。

你可以阅读异步方法here, in this tutorial(注意,你还需要@EnableAsync

方法应该是 called/implemented 我是监听器并且是 public void

侦听器的概念很容易掌握 - 这些是应用程序上下文初始化生命周期的挂钩。您需要关注 thos thread