Apache artemis需要使用STRICT配置创建许多连接服务器节点

时间:2017-12-12 19:00:38

标签: activemq-artemis

我检查了clustered-static-discovery,也检查了基于udp的群集, 我所看到的如果我在集群中有2个节点则必须要求2个连接,如果我有4个那么必须要有4个连接来循环消费消息。

假设我有2个服务器需要2个连接,如果我只创建了一个连接或监听器,并且将产生10个消息,那么我将错过5个消息。

我们如何在一个连接中接收消息而不是创建多个连接(取决于使用了多少个服务器节点)。 因为存在添加运行时节点的情况,所以我们将错过那些将在运行时添加节点

的消息

这里是示例我有2个节点(在群集中)和一个连接

import javax.jms.*;
import org.apache.activemq.artemis.api.jms.ActiveMQJMSClient;
import org.apache.activemq.artemis.core.client.impl.ClientSessionInternal;
import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
import org.apache.activemq.artemis.util.ServerUtil;
/**
 * A simple example that demonstrates server side load-balancing of messages between the queue instances on different
 * nodes of the cluster. The cluster is created from a static list of nodes.
 */
public class StaticClusteredQueueExample {
   public static void main(final String[] args) throws Exception {
      Connection connection0 = null;
      try {

         Topic topic = ActiveMQJMSClient.createTopic("exampleTopic");

         ConnectionFactory cf0 = new ActiveMQConnectionFactory("tcp://localhost:9616");
         Thread.sleep(2000);

         connection0 = cf0.createConnection();
         final String clientID = "admin";
         connection0.setClientID(clientID);
         final String subscriptionName = "mySub";

         Session session0 = connection0.createSession(false, Session.AUTO_ACKNOWLEDGE);
         connection0.start();

         MessageConsumer subscriber0 = session0.createDurableSubscriber(topic, subscriptionName);
         Thread.sleep(2000);

         MessageProducer producer = session0.createProducer(topic);
         //  We send 20 messages to server 
         final int numMessages = 20;
         for (int i = 0; i < numMessages; i++) {
            TextMessage message = session0.createTextMessage("This is text message " + i);
            producer.send(message);
            System.out.println("Sent message: " + message.getText());
         }
         Thread.sleep(2000);

         for (int i = 0; i < numMessages; i += 2) {
            try {
               TextMessage message0 = (TextMessage) subscriber0.receive(5000);
               System.out.println("" + message0.getText() + ": from node " + ServerUtil.getServer(connection0));
            } catch (Exception e) {}
         }
      } finally {
         // Step 15. Be sure to close our resources!
         if (connection0 != null) {
            connection0.close();
         }
      }
   }
}

在上面的示例中,由制作人发送20条消息 但是当我打印输出时,它只打印10条消息而不是20条

1 个答案:

答案 0 :(得分:0)

the clustering documentation所述,群集中消息负载均衡的方式取决于<message-load-balancing>上的<cluster-connection>配置元素。文档说明:

  

此参数确定是否/如何在群集的其他节点之间分发消息。它可以是三个值中的一个 - OFFSTRICTON_DEMAND(默认值)。此参数替换已弃用的forward-when-no-consumers参数。

     

如果设置为OFF,则消息将永远不会转发到群集中的其他节点

     

如果将其设置为STRICT,那么即使群集的其他节点上的相同队列可能根本没有消费者,或者他们可能拥有非消费者,每个传入消息都将被循环播放匹配消息过滤器(选择器)。请注意,如果其他节点上没有相同名称的队列,则Apache ActiveMQ Artemis不会将消息转发到其他节点,即使此参数设置为STRICT也是如此。使用STRICT就像将遗留forward-when-no-consumers参数设置为true

     

如果将其设置为ON_DEMAND,那么Apache ActiveMQ Artemis将仅将消息转发到群集的其他节点,如果它们被转发到的地址具有包含消费者的队列,并且这些消费者具有消息过滤器(选择器)这些选择器中的至少一个必须与消息匹配。使用ON_DEMAND就像将legacy forward-when-no-consumers参数设置为false

     

默认为ON_DEMAND

clustered-static-discovery示例对STRICT使用<message-load-balancing>,这就是为什么需要连接到每个节点的原因。

另外,请记住<redistribution-delay>会影响此处的行为。您可以在the clustering documentation的“消息重新分发”部分中详细了解该内容。

如果您对ON_DEMAND使用<message-load-balancing><redistribution-delay>使用>=0,那么您将能够从连接中使用群集中特定队列上的每条消息到一个节点。