以下是代理中Artemis集群(3台服务器(的设置.xml
<!-- Clustering configuration -->
<broadcast-groups>
<broadcast-group name="my-broadcast-group">
<broadcast-period>5000</broadcast-period>
<jgroups-file>test-jgroups-file_ping.xml</jgroups-file>
<jgroups-channel>active_broadcast_channel</jgroups-channel>
<connector-ref>netty-connector</connector-ref>
</broadcast-group>
</broadcast-groups>
<discovery-groups>
<discovery-group name="my-discovery-group">
<jgroups-file>test-jgroups-file_ping.xml</jgroups-file>
<jgroups-channel>active_broadcast_channel</jgroups-channel>
<refresh-timeout>10000</refresh-timeout>
</discovery-group>
</discovery-groups>
<cluster-connections>
<cluster-connection name="my-cluster">
<connector-ref>netty-connector</connector-ref>
<retry-interval>500</retry-interval>
<use-duplicate-detection>true</use-duplicate-detection>
<message-load-balancing>STRICT</message-load-balancing>
<max-hops>1</max-hops>
<discovery-group-ref discovery-group-name="my-discovery-group"/>
</cluster-connection>
</cluster-connections>
<ha-policy>
<shared-store>
<colocated>
<backup-port-offset>100</backup-port-offset>
<backup-request-retries>-1</backup-request-retries>
<backup-request-retry-interval>2000</backup-request-retry-interval>
<max-backups>2</max-backups>
<request-backup>true</request-backup>
<master>
<failover-on-shutdown>true</failover-on-shutdown>
</master>
<slave>
<scale-down/>
</slave>
</colocated>
</shared-store>
</ha-policy>
群集和 ha 配置在所有服务器中都相同。我试图理解和执行的故障转移方案如下所示。
- 按提到的顺序启动代理 1,代理 2,代理 3。在这里我可以 从管理 UI 中查看代理 1 具有备份代理 2 和代理 3。 代理 2 有代理 1 的支持。代理 3 没有任何备份。
我在下面写了连接到服务器的程序
public static void main(final String[] args) throws Exception { Connection connection = null; InitialContext initialContext = null; try { Properties properties = new Properties(); properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory"); properties.put("connectionFactory.ConnectionFactory", "(tcp://localhost:61616,tcp://localhost:61617,tcp://localhost:61618)?ha=true&retryInterval=1000&retryIntervalMultiplier=1.0&reconnectAttempts=-1"); properties.put("queue.queue/exampleQueue", "exampleQueue"); // Step 1. Create an initial context to perform the JNDI lookup. initialContext = new InitialContext(properties); ConnectionFactory cf = (ConnectionFactory) initialContext.lookup("ConnectionFactory"); // Step 2. Look-up the JMS Queue object from JNDI Queue queue = (Queue) initialContext.lookup("queue/exampleQueue"); // Step 3. Create a JMS Connection connection = cf.createConnection("admin", "admin"); // Step 4. Start the connection connection.start(); // Step 5. Create a JMS session with AUTO_ACKNOWLEDGE mode Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // Step 8. Create a text message BytesMessage message = session.createBytesMessage(); message.setStringProperty(InfoSearchEngine.QUERY_ID_HEADER_PARAM, "123"); MessageConsumer consumer0 = session.createConsumer(queue); // Step 9. Send the text message to the queue while (true) { try { Thread.sleep(500); // Step 7. Create a JMS message producer MessageProducer messageProducer = session.createProducer(queue); messageProducer.send(message); System.out.println("Sent message: " + message.getBodyLength()); } catch (Exception e) { System.out.println("Exception - " + e.getLocalizedMessage()); } } } finally { if (connection != null) { // Step 20. Be sure to close our JMS resources! connection.close(); } if (initialContext != null) { // Step 21. Also close the initialContext! initialContext.close(); } } }
如果我关闭代理 1,程序将转移到代理 2 并运行良好。如果 我关闭了代理 2,然后程序无法连接到代理 3。
我预计 broker3 应该已经开始处理请求,因为它在集群中。
2 具有代理 1 的支持。 代理 3 没有任何备份。
Artemis中的故障转移仅在实时和备份之间工作。 在您的场景中,代理 1 正在备份代理 2,因此当您关闭代理 1 时,这意味着代理 2 不再具有备份,因此当您关闭代理 2 时,不会发生故障转移。 应在master
和slave
配置中指定<group-name>
,以便以更有条理的方式形成备份,以免发生此类情况。