У меня возникли проблемы с отправкой сообщения в 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. Я все равно не смог бы ответить на этот вопрос в этих комментариях.
Спасибо! Подскажите, пожалуйста, как изменить соединение по протоколу по умолчанию? Я думал, что смогу сделать это, используя разные порты или параметры запроса.