【发布时间】:2021-01-19 04:15:16
【问题描述】:
我正在尝试弄清楚如何利用 ActiveMQ Artemis 来实现以下拓扑。我确实需要让多个生产者写入托管在两个独立 Artemis 代理上的队列。目前,每个生产者创建两个连接工厂,它们处理与 2 个代理的连接并创建相应的队列。
@Bean
public ConnectionFactory jmsConnectionFactoryBroker1() {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerUrl_1,username,password);
return connectionFactory;
}
@Bean
public ConnectionFactory jmsConnectionFactoryBroker2() {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerUrl_2,username,password);
return connectionFactory;
}
我的主要问题是我需要知道哪个队列分配给哪个代理,同时我需要知道如果一个代理由于某种原因关闭,我可以重新创建该队列到另一个代理飞并避免丢失任何进一步的消息。所以我的方法是设置代理网址如下
artemis.brokerUrl_1=(tcp://myhost1:61616,tcp://myhost2:61616)?randomize=false
artemis.brokerUrl_2=(tcp://myhost2:61616,tcp://myhost1:61616)?randomize=false
因此,为每个代理 url 使用不同的 JmsTemplate 我的意图是当提到 JmsTemplate
使用 brokerUrl_1 将在 myhost1 上创建队列,对应的 JmsTemplate 也是如此
为brokerUrl_2。
我本来预计(由于随机化参数)每个队列都会对代理具有某种静态成员资格,并且在代理失败的情况下,会通过从头开始重新创建队列来进行某种迁移另一个经纪人。
相反,我注意到几乎每次队列创建的分布都不会像想象的那样发生,而是随机发生,因为同一个队列可能出现在任一代理中,这是不可取的 对于我的用例。
我如何处理这种情况并解决我的问题,我可以在预定义的代理上创建我的队列并具有故障安全,如果一个代理关闭,生产者将创建相同的队列到 其他经纪人并继续?
请注意,在代理之间共享状态不是一种选择
【问题讨论】:
-
你使用的是什么客户端库?
-
我使用 Spring Boot JmsTemplate 和连接工厂
org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory (org.springframework.boot:spring-boot-starter-artemis)
标签: activemq-artemis