簡體   English   中英

使用無限循環導入jar時,Spring Java項目未啟動Tomcat

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

我有一個 Java 應用程序,它只是從另一個項目中獲取一個 jar,該 jar 使用無限循環來輪詢有關 AWS SQS 主題的消息。

該循環在我的客戶端應用程序中查找用@subscriber注釋的方法。

我有一個 bean,它將返回一個帶有注釋方法的類。 當我刪除使用注釋方法調用類的 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>

我的主班看起來像這樣

@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 started on port 1339 消息”

我不知道當“使用反射 API 查找用@subscirber 注釋的方法”時究竟會發生什么,但如果實施效率低下 - 這肯定需要一些時間。

因此,我建議進行線程轉儲,並在到達日志中感覺應用程序卡住的點時嘗試分析正在運行的線程。

另一個可疑點是你寫的:

當我刪除使用注釋方法調用類的 bean 時,我的 tomcat 在端口上啟動。

這豆究竟是什么? 帶有注釋方法的類是什么? 它是否嘗試連接到 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

或完全刪除它以獲得默認配置

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM