使用 Spring Integration 向 ActiveMQ Artemis 主题发送消息
Posted
技术标签:
【中文标题】使用 Spring Integration 向 ActiveMQ Artemis 主题发送消息【英文标题】:Sending message with Spring Integration to ActiveMQ Artemis topic 【发布时间】:2018-11-24 00:37:44 【问题描述】:目标
我想向一个主题发送一条消息,稍后我将使用客户端应用程序处理该主题。为此,我使用 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 映像。
问题
在生产者端,消息似乎成功发送,但在消息代理端,消息丢失。地址已创建,但队列缺失。
主题名称以后会动态,所以我不允许在broker.xml中手动创建主题。我依赖于 Artemis 的自动队列创建功能。
为什么在这种情况下消息发送不起作用?
书呆子注意:我知道星门基本上是通过虫洞以点对点的方式连接的,但为了这个问题,让我们忽略这个事实。
【问题讨论】:
在您向其发送消息之前是否已订阅该主题?如果没有,则消息将无处可去,并且将被丢弃。此外,您的屏幕截图显示了“队列”选项卡中的数据,但主题显示在“地址”选项卡上。 还没有订阅者。我包括了“地址”选项卡的屏幕截图。 【参考方案1】:当一条消息被发送到一个主题并且为地址和队列启用了自动创建时,只会创建地址而不是队列。如果队列是自动创建的,并且消息被放入队列中,这将违反主题的语义。主题地址上的订阅队列仅在响应订阅者时创建。因此,您需要在发送消息之前订阅该主题,否则该消息将被丢弃(根据主题语义)。
【讨论】:
谢谢,我误解了持久性/持久性主题定义。 @justin-bertram activemq 或 artemis 如何对客户端(用户)进行身份验证。我搜索了很多,但没有找到任何有用的资源。 @NoorKhan,请为此创建一个新问题。以上是关于使用 Spring Integration 向 ActiveMQ Artemis 主题发送消息的主要内容,如果未能解决你的问题,请参考以下文章
Spring Integration JMS 创建 ActiveMQ 队列而不是主题
Spring Integration Xmpp 4 - 发送创建 muc 请求
MyBatis(3.2.3) - Integration with Spring
如何将请求标头添加到 outboundGateway spring integration dsl