Отправка сообщения с помощью Spring Integration в тему ActiveMQ Artemis

Цель

Я хочу отправить сообщение в тему, которую я обработаю позже с помощью клиентских приложений. Для этой цели я использую Spring Boot и Spring Integration Java DSL с его модулем JMS. В качестве брокера сообщений я использую собственный ActiveMQ Artemis.


Вот мои настройки

DemoApplication.java

@SpringBootApplication
public class DemoApplication {

    private static final Logger logger = LoggerFactory.getLogger(DemoApplication.class);

    public interface StarGate {
        void sendHello(String helloText);
    }

    @Autowired
    private ConnectionFactory connectionFactory;

    @Bean
    public IntegrationFlow mainFlow() {
        return IntegrationFlows
                .from(StarGate.class)
                .handle(Jms.outboundAdapter(connectionFactory)
                        .configureJmsTemplate(jmsTemplateSpec -> jmsTemplateSpec
                                .deliveryPersistent(true)
                                .pubSubDomain(true)
                                .sessionTransacted(true)
                                .sessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE)
                                .explicitQosEnabled(true)
                        )
                        .destination(new ActiveMQTopic("wormhole")))
                .get();
    }

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(DemoApplication.class, args);
        StarGate stargate = context.getBean(StarGate.class);
        stargate.sendHello("Jaffa, kree!");
        logger.info("Hello message sent.");
    }

}

application.properties

spring.artemis.mode=native
spring.artemis.host=localhost
spring.artemis.port=61616
spring.artemis.user=artemis
spring.artemis.password=simetraehcapa

spring.jms.pub-sub-domain=true
spring.jms.template.delivery-mode=persistent
spring.jms.template.qos-enabled=true
spring.jms.listener.acknowledge-mode=client

logging.level.org.springframework=INFO

build.gradle (важные части)

springBootVersion = '2.0.2.RELEASE'
dependencies {
    compile('org.springframework.boot:spring-boot-starter-artemis')
    compile('org.springframework.boot:spring-boot-starter-integration')
    compile('org.springframework.integration:spring-integration-jms')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

В качестве сервера ActiveMQ Artemis я использую образ докера vromero / artemis (2.6.0) с конфигурацией по умолчанию.


Проблема

На стороне производителя сообщение кажется успешно отправленным, но на стороне сообщения брокера сообщение отсутствует. Адрес создан, но очередь отсутствует.

Адреса консоли ActiveMq Artemic  ActiveMq Artemic Console Queues

Название темы будет динамическим в будущем, поэтому мне не разрешено создавать тему вручную в broker.xml. Я полагаюсь на функцию автоматического создания очереди Artemis.

Почему в этом случае не работает отправка сообщений?


Примечание для ботаников: я знаю, что Звездные врата в основном связаны через червоточины по принципу точка-точка, но ради вопроса давайте проигнорируем этот факт.


person Csuki    schedule 14.06.2018    source источник
comment
Есть ли подписка на тему, прежде чем вы отправите на нее сообщение? В противном случае сообщению не будет места, и оно будет отброшено. Кроме того, на вашем снимке экрана показаны данные из вкладки «Очереди», но темы отображаются на вкладке «Адреса».   -  person Justin Bertram    schedule 14.06.2018
comment
Подписчика пока нет. Я приложил скриншот вкладки Адреса.   -  person Csuki    schedule 14.06.2018


Ответы (1)


Когда сообщение отправляется в тему и автоматическое создание включено как для адресов, так и для очередей, будет создан только адрес, а не очередь. Если бы очередь была создана автоматически, и сообщение было помещено в очередь, это нарушило бы семантику темы. Очередь подписки на адрес темы создается только в ответ на подписчика. Следовательно, перед отправкой сообщения вам потребуется подписчик на тему, в противном случае сообщение будет отброшено (в соответствии с семантикой темы).

person Justin Bertram    schedule 14.06.2018
comment
Спасибо, я неправильно понял определение устойчивой / долговечной темы. - person Csuki; 14.06.2018