Проект Spring Java не запускает Tomcat при импорте jar с бесконечным циклом - PullRequest
0 голосов
/ 12 марта 2020

У меня есть приложение java, которое просто берет банку из другого проекта, банку использует бесконечный l oop для опроса сообщений на AWS SQS topi c.

l oop ищет методы, помеченные @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 

Журнала нет, после этого я ожидаю чего-то подобного, что я и получаю если я уберу l oop. Когда я удаляю l oop, я получаю что-то вроде ниже, но проблема в том, что мне нужен l oop для непрерывного опроса.

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

Ответы [ 2 ]

1 голос
/ 13 марта 2020

Так как ошибки нет,

Spring boot, вероятно, что-то делает, и это может занять некоторое время ... Когда инициализация контекста приложения завершена, весенняя загрузка, наконец, пишет "tomcat запущен на сообщении порта 1339"

Я не знаю, что именно происходит, когда "API-интерфейс отражений для поиска методов, аннотированных @subscirber", но если реализовано неэффективно - это определенно может занять некоторое время.

Поэтому я предлагаю взять поток дамп и попытка проанализировать запущенные потоки, когда вы достигаете точки в журнале, где вы чувствуете, что приложение застревает.

Еще один подозрительный момент - то, что вы написали:

Когда я удаляю bean-компонент, вызывающий класс с методом аннотации my tomcat, запускается на порту.

Что это за боб? что такое класс с методом аннотации? Он пытается подключиться к AWS? Если так, что, если определения неправильны, и это застревает, пытаясь соединиться? Снова трассировка стека многое прояснит здесь.

Обновление

Threas dump (вы должны прочитать его снизу вверх - он показывает текущие вызовы выполнение chsin) показывает, что в конструкторе SubscriberFactory вы пытаетесь подключиться к SQS Aws, и он застревает ...

Это ненормальная ситуация. Возможно, вы сделали что-то не так с параметрами подключения.

С точки зрения инициализации пружины он блокирует весь процесс инициализации, потому что Spring создает бины один за другим в одном потоке

В любом случае, правильное подключение к sqs, вероятно, решит проблему.

Обновление 2

Ответ на вопрос запуска компонента в другом потоке.

Вы запускаете компонент, а не метод в компоненте.

Это не должен быть конструктор или метод, аннотированный @PostConstruct, потому что эти методы вызываются пружиной во время инициализации

Вы можете использовать @Async метод в приемнике, который будет запускаться, когда приложение готово.

Вы можете прочитать об асинхронных методах здесь, в этом уроке (обратите внимание, вам также нужно @EnableAsync)

Метод должен быть вызван / реализован в слушателе и be public void

Понятие слушателей легко понять asp - это крюки для жизненного цикла инициализации контекста приложения. Вам нужно будет следовать этой теме

0 голосов
/ 12 марта 2020

Вы переопределяете порт по умолчанию Tomcat HTTP своим файлом application.properties, и поэтому вы не видите его, начиная с 8080:

server:
  port: 1339

измените его на

server:
  port: 8080

или удалите его полностью, чтобы иметь конфигурацию по умолчанию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...