[英]How does spring jms distribute messages among durable topic listeners?
raw jms code: 原始的jms代码:
TopicSubscriber durSubscriber1 = receiverSession.createDurableSubscriber(topic,"subscription_1");
durSubscriber1.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
RMQTextMessage rmqTextMessage = ((RMQTextMessage) message);
try {
System.out.println("sub_1:" + rmqTextMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
TopicSubscriber durSubscriber2 = receiverSession.createDurableSubscriber(topic,"subscription_2");
durSubscriber2.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
RMQTextMessage rmqTextMessage = ((RMQTextMessage) message);
try {
System.out.println("sub_2:" + rmqTextMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
When I use following code each listener gets all messages. 当我使用以下代码时,每个侦听器都会获取所有消息。 If I use same subscription name - application doesn't start.
如果我使用相同的订阅名称-应用程序无法启动。
From another hand I wrote code which uses spring jms: 我从另一手编写了使用spring jms的代码:
config: 配置:
@Bean
public JmsListenerContainerFactory<?> myFactory(DefaultJmsListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
// This provides all boot's default to this factory, including the message converter
configurer.configure(factory, connectionFactory);
// You could still override some of Boot's default if necessary.
factory.setPubSubDomain(true);
factory.setSubscriptionDurable(true);
return factory;
}
listeners: 听众:
@JmsListener(destination = "my_topic_new", containerFactory = "myFactory")
public void receiveTopic(Email email) {
System.out.println("list_1:" + email);
}
@JmsListener(destination = "my_topic_new", containerFactory = "myFactory")
public void receiveTopicDup(Email email) {
System.out.println("list_2:" + email);
}
At this case both listeners divide messages. 在这种情况下,两个侦听器都将消息分开。 I mean that if producer sends 10 messages then listener_1 will get N messages and listener_2 will get M messages.
我的意思是,如果生产者发送10条消息,则listener_1将获得N条消息,listener_2将获得M条消息。
M+N=10 M + N = 10
Please explain difference at 2 code snippets. 请在2个代码段中说明差异。 Can you provide corresponding jms code for spring-jms version ?
您可以为spring-jms版本提供相应的jms代码吗?
It's due to the way the rabbit JMS client maps JMS to native AMQP. 这是由于Rabbit JMS客户端将JMS映射到本地AMQP的方式所致。 You have to give each listener a subscription name;
您必须为每个侦听器指定一个订阅名称; otherwise they will compete for messages in the same queue.
否则,他们将竞争同一队列中的消息。
@JmsListener(destination = "my_topic_new", containerFactory = "myFactory", subscription = "foo")
public void receiveTopic(String email) {
System.out.println("list_1:" + email);
}
@JmsListener(destination = "my_topic_new", containerFactory = "myFactory", subscription = "bar")
public void receiveTopicDup(String email) {
System.out.println("list_2:" + email);
}
This is only needed for durable subscriptions. 仅对于持久订阅才需要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.