Jms 在ActiveMQ Artemis的主题上加载平衡消费者

Jms 在ActiveMQ Artemis的主题上加载平衡消费者,jms,activemq-artemis,jms-topic,Jms,Activemq Artemis,Jms Topic,我正在使用ActiveMQ Artemis 2.10和JMS客户端1.1客户端 如果我在我的地址上使用了多播路由类型,并且需要持久订阅,那么如何在用户端实现负载平衡 如果使用ActiveMQ5,它将是 目前尚不清楚,当消费某个主题的非持久订阅时,如何使用ActiveMQ Artemis 7.2和JMS Client 1.1客户端实现消费端负载平衡 在上述示例中: 在示例中,每个使用者都会设置clientId(client123和client456),但这意味着只能有一个client123的实例

我正在使用ActiveMQ Artemis 2.10和JMS客户端1.1客户端

如果我在我的地址上使用了多播路由类型,并且需要持久订阅,那么如何在用户端实现负载平衡

如果使用ActiveMQ5,它将是

目前尚不清楚,当消费某个主题的非持久订阅时,如何使用ActiveMQ Artemis 7.2和JMS Client 1.1客户端实现消费端负载平衡

在上述示例中:

在示例中,每个使用者都会设置clientId(
client123
client456
),但这意味着只能有一个
client123
的实例从
client123.topic.foo
消费

我目前的理解是,ActiveMQ Artemis 2.10和JMS客户端1.1客户端意味着您不能在主题上进行负载平衡,对吗

唯一的选项似乎是ActiveMQ Artemis 2.10和JMS Client 2.0,它允许您创建共享持久订阅,对吗

有第三种选择吗

我目前的理解是,活动MQ Artemis 7.2和JMS客户端1.1客户端意味着您不能在主题上进行负载平衡,对吗

没有

唯一的选项似乎是活动MQ Artemis 7.2和JMS Client 2.0,它允许您创建共享持久订阅,对吗

没有

有第三种选择吗

对。您可以将持久订阅与JMS使用者一起使用。如中所述,JMS主题映射到核心地址,该JMS主题上的订阅映射到核心地址上的核心队列。对于持久JMS订阅,该队列的名称遵循模式“”。下面是一些要演示的示例代码:

ConnectionFactory cf=new-ActiveMQConnectionFactory(“tcp://127.0.0.1:61616");
connection1=cf.createConnection();
连接1.setClientID(“myClientID”);
会话session1=connection1.createSession(false,Session.AUTO_-ACKNOWLEDGE);
Topic Topic=新的ActiveMQTopic(“myTopic”);
MessageConsumer consumer1=session1.createDurableSubscriber(主题“mySubscriptionName”);
connection2=cf.createConnection();
会话session2=connection2.createSession();
Destination Destination=new ActiveMQQueue(“myTopic::myClientID.mySubscriptionName”);
MessageConsumer consumer2=session2.createConsumer(目的地);
//发送2条消息
MessageProducer=session1.createProducer(主题);
producer.send(session1.createMessage());
producer.send(session1.createMessage());
producer.close();
//与第一消费者一起接收第一条消息
connection1.start();
message1=consumer1.receive();
consumer1.close();
//与第二消费者一起接收第二条消息
connection2.start();
message2=consumer2.receive();
consumer2.close();
换一种说法


由于JMS 1.1不明确允许共享持久订阅,因此您不能在同一主题上使用相同的客户端标识符和订阅名称,使用
createDurableSubscriber
水平扩展应用程序。但是,如果一个应用程序使用
createDurableSubscriber
,而所有其他应用程序仅使用其“完全限定队列名称”直接从基础订阅队列消费,则可以水平扩展(它源自首次使用
createDurableSubscriber
创建时使用的客户端标识符和订阅名称).

正确。更新了问题。请您确认我对您的答案的理解。当直接订阅主题时,请提供clientID,但您无法实现负载平衡。如果您需要负载平衡,请使用派生队列,而不提供clientID。consumer1-直接订阅主题并提供clientID,如果需要的话它本身是一个Java应用程序,无法水平扩展。consumer2-订阅队列(Artemis功能)不提供clientID如果这是它自己的Java应用程序,您可以水平扩展它。结论如果您在JMS 1.x队列消费中需要水平可伸缩性,并且不提供clientID。请验证理解。我更新了我的答案以解决您的评论。希望对您有所帮助。