如何使用 Spring JMS 访问 FQQN?
How to access a FQQN with Spring JMS?
我的 Artemis 代理配置如下:
<address name="PublishSubscribeWithPreDefinedQueues">
<multicast>
<queue name="Queue1"/>
<queue name="Queue2"/>
</multicast>
</address>
如何告诉我的消费客户端连接到 Queue1?根据 the docs,我必须将地址名称和队列名称与 ::
分开,但我无法正常工作。
@JmsListener(destination = "PublishSubscribeWithPreDefinedQueues::Queue1")
这将创建一个名为 PublishSubscribeWithPreDefinedQueues::Queue1
的新地址。
有什么想法吗?谢谢!
你想要实现的是一个共享的耐用消费者。多个侦听器,但对同一 FQQN 的多个消费者进行负载平衡。
所以我有完全相同的问题,我使用 spring 启动。我仔细查看了 spring 引导,发现 @JmsListener 正在设置一个 MessagingMessageListenerAdapter,它是一个调用您定义的方法的 MessageListener 适配器。
有趣的部分是 AbstractMessageListenerContainer,它是
Abstract base class for Spring message listener container
implementations. Can either host a standard JMS
javax.jms.MessageListener or Spring's SessionAwareMessageListener for
actual message processing.
有一种方法 getDefaultSubscriptionName(Object messageListener)
可以获取您的消息侦听器。
如果我们看一下实现:
protected String getDefaultSubscriptionName(Object messageListener) {
if (messageListener instanceof SubscriptionNameProvider) {
return ((SubscriptionNameProvider) messageListener).getSubscriptionName();
}
else {
return messageListener.getClass().getName();
}
}
因此,如果我们不提供订阅名称,spring 将采用 org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter 作为名称,因为所有 @JmsListeners 都是 MessagingMessageListenerAdapter 的实例。
所以要配置它,我们必须将订阅共享和持久化的工厂设置为 true。
@Bean
public DefaultJmsListenerContainerFactory containerFactory(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory =
new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setSubscriptionDurable(true);
factory.setSubscriptionShared(true);
factory.setDestinationResolver(new BeanFactoryDestinationResolver(beanFactory)); //or new DynamicDestinationResolver()
factory.setPubSubDomain(true);
return factory;
}
现在您可以使用注释如下:
@JmsListener(destination = "PublishSubscribeWithPreDefinedQueues", containerFactory="containerFactory", subscription="Queue1")
订阅名称现在是您地址的队列名称。
我的 Artemis 代理配置如下:
<address name="PublishSubscribeWithPreDefinedQueues">
<multicast>
<queue name="Queue1"/>
<queue name="Queue2"/>
</multicast>
</address>
如何告诉我的消费客户端连接到 Queue1?根据 the docs,我必须将地址名称和队列名称与 ::
分开,但我无法正常工作。
@JmsListener(destination = "PublishSubscribeWithPreDefinedQueues::Queue1")
这将创建一个名为 PublishSubscribeWithPreDefinedQueues::Queue1
的新地址。
有什么想法吗?谢谢!
你想要实现的是一个共享的耐用消费者。多个侦听器,但对同一 FQQN 的多个消费者进行负载平衡。
所以我有完全相同的问题,我使用 spring 启动。我仔细查看了 spring 引导,发现 @JmsListener 正在设置一个 MessagingMessageListenerAdapter,它是一个调用您定义的方法的 MessageListener 适配器。 有趣的部分是 AbstractMessageListenerContainer,它是
Abstract base class for Spring message listener container implementations. Can either host a standard JMS javax.jms.MessageListener or Spring's SessionAwareMessageListener for actual message processing.
有一种方法 getDefaultSubscriptionName(Object messageListener)
可以获取您的消息侦听器。
如果我们看一下实现:
protected String getDefaultSubscriptionName(Object messageListener) {
if (messageListener instanceof SubscriptionNameProvider) {
return ((SubscriptionNameProvider) messageListener).getSubscriptionName();
}
else {
return messageListener.getClass().getName();
}
}
因此,如果我们不提供订阅名称,spring 将采用 org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter 作为名称,因为所有 @JmsListeners 都是 MessagingMessageListenerAdapter 的实例。
所以要配置它,我们必须将订阅共享和持久化的工厂设置为 true。
@Bean
public DefaultJmsListenerContainerFactory containerFactory(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory =
new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setSubscriptionDurable(true);
factory.setSubscriptionShared(true);
factory.setDestinationResolver(new BeanFactoryDestinationResolver(beanFactory)); //or new DynamicDestinationResolver()
factory.setPubSubDomain(true);
return factory;
}
现在您可以使用注释如下:
@JmsListener(destination = "PublishSubscribeWithPreDefinedQueues", containerFactory="containerFactory", subscription="Queue1")
订阅名称现在是您地址的队列名称。