当前位置: 首页 > 知识库问答 >
问题:

将带有Spring集成的消息发送到ActiveMQ Artemis主题

子车高超
2023-03-14

目标

我想发送一个消息到一个主题,我将处理稍后与客户机应用程序。为此,我使用Spring Boot和Spring Integration Java DSL及其JMS模块。作为消息代理,我使用本机ActiveMQ Artemis。

这是我的设置

@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.");
    }

}
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
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映像。

问题所在

在producer端,消息似乎已成功发送,但在message broker端,消息丢失。创建了地址,但缺少队列。

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

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

共有1个答案

宋建柏
2023-03-14

当消息被发送到一个主题并且对地址和队列都启用了自动创建时,将只创建地址,而不创建队列。如果自动创建队列并将消息放入队列中,这将违反主题的语义。主题地址上的订阅队列只在响应订阅者时创建。因此,在发送消息之前,您需要一个主题的订阅者,否则消息将被删除(根据主题语义)。

 类似资料:
  • 简单的消息发布器如下所示: ...其配置如下: 问题是,此发布服务器将消息发送到准备好的默认目标,但我需要将消息发送到不同的队列。在我的情况下,我的应用程序中的每个任务都需要一个消息队列。原因是,如果要中止任务,必须从代理中删除消息。如果一个任务有数千条消息,那么使用选择器接收所有消息不是一个好的做法。我需要从消息代理中删除中止任务的所有消息,而不接收客户端。JMS仅支持消息的发送和接收。我必须使

  • 所以,问题在于路由器。当路由器尝试向通道发送消息时,我会收到错误:Dispatcher没有通道“newTypingNotificationHandler”的订户。输入'。但我有这个频道名称的集成流防御。 原因: org.springframework.integration.MessageDispatching异常:调度器在org.springframework.integration.dispa

  • 在Spring集成中使用出站网关时,我试图在JMS标头中发送回复Q详细信息。我了解到JIRA#INT-97中的增强功能在将Spring消息标头发送到JMS目标之前将其复制到JMS标头。 在将消息发送到出站网关之前,将消息头设置如下。message.getHeader(). setAtcm(JmsTargetAdapter.JMS_REPLY_TO, myReplyDestation); 但是我无法

  • 我设置了一个EJB项目,使用JMS将持久性实体对象发送到MDB。我使用JBoss EAP 7,使用Apache ActiveMQ作为消息传递提供程序。我像这样设置ConnectionFactory和队列: 这是我的消息生成器,它接收“Account”实体对象作为参数并将其发送到队列: EntityEnqueueBean。Java语言 MDB从队列接收消息并对其进行处理: java账户 不确定我做错

  • 是否可以验证/筛选发送到Kafka主题的消息?

  • 我正在使用Spring Cloud Stream和RabbitMq在不同的微服务之间交换消息。 这是我发布消息的设置。 . 以及接收消息的设置 . 我能够成功地使用此设置交换消息。我希望,发送消息和接收消息的ID是相等的。但它们总是不同的UUID。 有没有一种方法可以让消息从生产者通过RabbitMq一直保持相同的ID到消费者?