使用Spring Integration向ActiveMQ Artemis主题发送消息

时间:2018-06-14 09:23:54

标签: jms spring-integration activemq spring-integration-dsl 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)docker镜像和默认配置。

问题

在制作人方面,该消息似乎已成功发送,但在消息经纪方消息缺失。地址已创建但队列丢失。

ActiveMq Artemic Console Addresses ActiveMq Artemic Console Queues

将来该主题的名称将是动态的,因此我不允许在broker.xml中手动创建主题。我依靠Artemis的自动队列创建功能。

为什么在这种情况下邮件发送不起作用?

  

书呆子注意:我知道Star Gates基本上是通过虫洞以点对点方式连接的,但为了这个问题,让我们忽略这个事实。

1 个答案:

答案 0 :(得分:4)

当向主题发送消息并且为地址和队列启用自动创建时,将仅创建地址而不是队列。如果队列是自动创建的,则消息被放入队列中会违反主题的语义。仅在响应订户时创建主题地址上的订阅队列。因此,在发送消息之前,您需要有关该主题的订阅者,否则将丢弃该消息(根据主题语义)。