gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:53:09 27 4
gpt4 key购买 nike

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

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

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

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

        <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>

我的主类看起来像这样

@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 ''

最佳答案

由于没有错误,

Spring Boot 可能会做一些事情,并且可能需要时间......当应用程序上下文的初始化完成时,Spring Boot 最终会写入“tomcat在端口 1339 上启动消息”

我不知道当“反射 API 查找用 @subscirber 注释的方法”时到底会发生什么,但如果实现效率低下 - 这肯定需要一些时间。

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

另一个可疑点是你写的:

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

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

更新

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

这是不正常的情况。可能是你的连接参数设置有问题。

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

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

更新2

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

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

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

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

您可以阅读有关异步方法的内容 here, in this tutorial (注意,您还需要@EnableAsync)

该方法应该在监听器中调用/实现,并且是 public void

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

关于java - Spring Java 项目在导入具有无限循环的 jar 时未启动 Tomcat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60656467/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com