我有一个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最终写入"tomcat started on port 1339 message">
我不知道当"反射API查找用@subsirber注释的方法"时会发生什么,但如果实现效率低下,这肯定需要一些时间。
因此,我建议进行线程转储,并在到达日志中您觉得应用程序卡住的点时尝试分析正在运行的线程。
另一个可疑点是你写的:
当我删除用注释方法调用类的bean时,我的tomcat在端口上启动。
这个bean到底是什么?带有注释方法的类是什么?它是否尝试连接到AWS?如果是这样的话,如果定义是错误的,并且它在尝试连接时被卡住了怎么办?堆栈跟踪将再次澄清这里的许多内容。
更新
线程转储(你应该从下到上阅读它——它显示了当前调用的执行chsin(显示,在SubscriberFactory的构造函数中,你试图连接到Aws的SQS,但它被卡住了。。。
这是不正常的情况。可能您对连接参数做了错误的处理。
从spring初始化的角度来看,它阻碍了整个初始化过程,因为spring在一个线程中逐个创建bean
无论如何,与sqs的正确连接可能会解决这个问题。
更新2
回答在不同线程中运行bean的问题。
你不运行bean,而是运行bean中的方法。
它不应该是用@PostConstruct
注释的构造函数或方法,因为这些是spring在初始化期间调用的方法
您可以在侦听器中使用@Async
方法,该方法将在应用程序准备就绪时运行。
在本教程中,您可以在这里阅读异步方法(注意,您还需要@EnableAsync
(
该方法应该在侦听器中调用/实现,并且是public void
监听器的概念很容易理解——它们是应用程序上下文初始化生命周期的挂钩。你需要遵循
您用application.properties
文件覆盖默认的Tomcat HTTP端口,这就是为什么您看不到它从8080:开始
server:
port: 1339
将其更改为
server:
port: 8080
或者完全删除它以具有默认配置