Тайм-аут подключения ActiveMQ Artemis в Spring Boot

У меня возникли проблемы с отправкой сообщения в ActiveMQ Artemis в Spring Boot:

Uncategorized exception occurred during JMS processing; nested exception is ActiveMQConnectionTimedOutException[errorType=CONNECTION_TIMEDOUT message=AMQ219013: Timed out waiting to receive cluster topology. Group:null]

Я использую контейнер apache/activemq-artemis:latest-alpine Docker. Я не стал его настраивать и открывать 5672 порт. Если я попытаюсь отправить сообщение по шаблону JMS, я получу эту ошибку. Мои бины (на Котлине):

@EnableJms
@Configuration
class JmsConfig {
    @Bean
    fun jmsTemplate(connectionFactory: ConnectionFactory): JmsTemplate {
        val jmsTemplate = JmsTemplate(connectionFactory)
        jmsTemplate.messageConverter = messageConverter()
        return jmsTemplate
    }

    @Bean
    fun messageConverter(): MessageConverter {
        val converter = MappingJackson2MessageConverter()

        converter.setTargetType(MessageType.TEXT)
        converter.setTypeIdPropertyName("_type")

        return converter
    }
}
@Configuration
class ActiveMQConfig {

    @Bean
    fun connectionFactory(): ConnectionFactory {
        return ActiveMQConnectionFactory("tcp://localhost:5672?protocols=STOMP,AMQP,MQTT", "artemis", "artemis")
    }
}

Место, куда я отправляю сообщение

@Service
class EmailGateway (
    private val template: JmsTemplate,
) {
    fun sendEmail(to: String, letter: Letter) {
        template.convertAndSend("test-queue", EmailInfo(to, letter))
    }
}

EmailInfo — это класс бизнес-логики, просто класс с полями.

Мои зависимости

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-security")
    implementation("org.springframework.boot:spring-boot-starter-quartz")
    implementation("org.springframework.boot:spring-boot-starter-artemis")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0")
    implementation("io.jsonwebtoken:jjwt:0.12.5")
    implementation("javax.jms:javax.jms-api:2.0.1")
    implementation("org.apache.activemq:artemis-jakarta-client:2.33.0")
    implementation("org.apache.activemq:artemis-jakarta-server:2.33.0")
    implementation("org.apache.activemq:artemis-jms-server:2.33.0")
    implementation("org.apache.activemq:artemis-jms-client:2.33.0")
    implementation("org.springframework.boot:spring-boot-starter-mail")
    runtimeOnly("org.postgresql:postgresql")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
}

Если я отключу ActiveMQ Artemis, ошибка изменится на:

Uncategorized exception occurred during JMS processing; nested exception is ActiveMQNotConnectedException[errorType=NOT_CONNECTED message=AMQ219007: Cannot connect to server(s). Tried with all available servers.]

Думаю, мне нужно настроить ActiveMQ Artemis, но каких-то дополнительных настроек в моем случае я не нашел. Рекомендации Spring Boot рассказывают, что мне просто нужно для использования шаблона JMS.

P.S. во встроенной конфигурации все работает корректно

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
187
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш ActiveMQConnectionFactory настроен на использование порта 5672. Это ConnectionFactory будет использовать протокол Core. Однако в конфигурации брокера по умолчанию порт 5672 настроен исключительно для AMQP. Попробуйте использовать это вместо этого:

return ActiveMQConnectionFactory("tcp://localhost:61616", "artemis", "artemis")

Спасибо! Подскажите, пожалуйста, как изменить соединение по протоколу по умолчанию? Я думал, что смогу сделать это, используя разные порты или параметры запроса.

Korlivar 03.05.2024 12:59

Короче говоря, вам нужно использовать другую реализацию клиента (т.е. библиотеку). Например, если вы хотите использовать JMS вместо AMQP, вам следует использовать реализацию Qpid JMS-клиента. Если вам нужна дополнительная информация, пожалуйста, задайте новый вопрос по этому поводу.

Justin Bertram 03.05.2024 15:05

Мне нужно использовать протокол STOMP. Можете ли вы прислать мне какую-нибудь библиотеку для работы с ней, пожалуйста?

Korlivar 03.05.2024 15:16

Вам нужно использовать STOMP из приложения Spring Boot?

Justin Bertram 03.05.2024 15:19

Да, мне нужно это использовать

Korlivar 03.05.2024 16:39

Насколько мне известно, не существует реализации клиента JMS, которая использует STOMP в качестве проводного протокола. Поэтому вы не сможете использовать ни один из компонентов интеграции Spring JMS. Сам Spring может предоставлять какой-то клиент STOMP, но я не эксперт по Spring, поэтому не уверен. Опять же, я призываю вас задать новый вопрос по этому поводу.

Justin Bertram 03.05.2024 16:43

Хорошо, если бы я решил использовать не конфигурацию Spring Boot. Как мне это сделать?

Korlivar 03.05.2024 17:40

Мы отошли от темы вашего первоначального вопроса. Цель комментариев — внести ясность, а не задать совершенно новые вопросы. Пожалуйста, создайте новый вопрос относительно вашего варианта использования STOMP. Я все равно не смог бы ответить на этот вопрос в этих комментариях.

Justin Bertram 03.05.2024 17:44

Другие вопросы по теме