gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:57:33 38 4
gpt4 key购买 nike

目标

我想向某个主题发送一条消息,稍后我将使用客户端应用程序处理该消息。为此,我使用 Spring Boot 和 Spring Integration Java DSL 及其 JMS 模块。作为消息代理,我使用 native 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 的自动队列创建功能。

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

<小时/>

Nerd note: I'm aware that Star Gates are basically connected via wormholes in a point-to-point manner but for the sake of the question let's ignore this fact.

最佳答案

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

关于jms - 使用 Spring Integration 向 ActiveMQ Artemis 主题发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50854011/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com