У меня возникли проблемы с отправкой сообщения в 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. во встроенной конфигурации все работает корректно




Ваш ActiveMQConnectionFactory настроен на использование порта 5672. Это ConnectionFactory будет использовать протокол Core. Однако в конфигурации брокера по умолчанию порт 5672 настроен исключительно для AMQP. Попробуйте использовать это вместо этого:
return ActiveMQConnectionFactory("tcp://localhost:61616", "artemis", "artemis")
Короче говоря, вам нужно использовать другую реализацию клиента (т.е. библиотеку). Например, если вы хотите использовать JMS вместо AMQP, вам следует использовать реализацию Qpid JMS-клиента. Если вам нужна дополнительная информация, пожалуйста, задайте новый вопрос по этому поводу.
Мне нужно использовать протокол STOMP. Можете ли вы прислать мне какую-нибудь библиотеку для работы с ней, пожалуйста?
Вам нужно использовать STOMP из приложения Spring Boot?
Да, мне нужно это использовать
Насколько мне известно, не существует реализации клиента JMS, которая использует STOMP в качестве проводного протокола. Поэтому вы не сможете использовать ни один из компонентов интеграции Spring JMS. Сам Spring может предоставлять какой-то клиент STOMP, но я не эксперт по Spring, поэтому не уверен. Опять же, я призываю вас задать новый вопрос по этому поводу.
Хорошо, если бы я решил использовать не конфигурацию Spring Boot. Как мне это сделать?
Мы отошли от темы вашего первоначального вопроса. Цель комментариев — внести ясность, а не задать совершенно новые вопросы. Пожалуйста, создайте новый вопрос относительно вашего варианта использования STOMP. Я все равно не смог бы ответить на этот вопрос в этих комментариях.
Спасибо! Подскажите, пожалуйста, как изменить соединение по протоколу по умолчанию? Я думал, что смогу сделать это, используя разные порты или параметры запроса.