activemq group分组

来源:互联网 发布:什么叫网络直播 编辑:程序博客网 时间:2024/06/10 23:41

Message Group是针对queue。如果在queue模式下,一个生产者对应多个消费者,每生产一条消息,会被消费随即抢到,如果我们不希望这样,只希望固定的消息被固定的消费者消费,那么就采用group对消息进行一个类似标记的作用。分组要依赖消息选择器,selector

另外一方面,Message Groups特性也是一种负载均衡的机制。在一个消息被分发到consumer之前,broker首先检查消息JMSXGroupID属性。如果存在,那么broker会检查是否有某个consumer拥有这个message group。如果没有,那么broker会选择一个consumer,并将它关联到这个message group。此后,这个consumer会接收这个message group的所有消息,直到:

  1:Consumer被关闭

  2:Message group被关闭,通过发送一个消息,并设置这个消息的JMSXGroupSeq为-1

关闭采用以下方式

message.setStringProperty("JMSXGroupID","GroupA");message.setIntProperty("JMSXGroupSeq", -1);



分组实例

1、生产者

package activemq;
import java.util.Random;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class GroupProducer {


private static final Logger LOGGER = LoggerFactory.getLogger(GroupProducer.class);
 
private static final String BROKER_URL = "failover://tcp://XXXX:61616";//ActiveMQConnection.DEFAULT_BROKER_URL;

private static final String SUBJECT = "testQueue";
 
public static void main(String[] args) throws JMSException, InterruptedException {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(BROKER_URL);
Connection conn = connectionFactory.createConnection();
conn.start();
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination dest = session.createQueue(SUBJECT);
MessageProducer producer = session.createProducer(dest);
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
int i = 0;
Thread.sleep(10000);
for(;i < 100;i ++){
int random = new Random().nextInt(10);
if(random % 2 == 0){
TextMessage message = session.createTextMessage("这是GroupA "+i);
message.setStringProperty("JMSXGroupID", "GroupA");
producer.send(message);
LOGGER.debug("send message GroupA {}", i);
}else{
TextMessage message = session.createTextMessage("这是GroupB "+i);
message.setStringProperty("JMSXGroupID", "GroupB");
producer.send(message);
LOGGER.debug("send message GroupB {}", i);
}
}
conn.close();
}
 
}

2、消费者1

package activemq;
import java.util.concurrent.CountDownLatch;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class GroupConsumer implements MessageListener{


 private static final Logger LOGGER = LoggerFactory.getLogger(GroupConsumer.class);
 
 private static final String BROKER_URL = "failover://tcp://XXXX:61616";
 
 private static final String SUBJECT = "testQueue";
 
 public static void main(String[] args) throws JMSException, InterruptedException {
 CountDownLatch latch = new CountDownLatch(1);
 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(BROKER_URL);
 Connection connection = connectionFactory.createConnection();
 connection.start();
 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
 Destination destination = session.createQueue(SUBJECT);
 MessageConsumer consumer = session.createConsumer(destination,"JMSXGroupID='GroupA'");

 consumer.setMessageListener(new GroupConsumer());
 latch.await();
 connection.close();
 }


public void onMessage(Message message) {
TextMessage textMessage = (TextMessage)message;
try {
            LOGGER.info ("get message " + textMessage.getText());
        } catch (JMSException e) {
            LOGGER.error("error {}", e);
        }
}

}

3、消费者2

package activemq;
import java.util.concurrent.CountDownLatch;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class GroupConsumer2 implements MessageListener{


 private static final Logger LOGGER = LoggerFactory.getLogger(GroupConsumer2.class);
 
 private static final String BROKER_URL = "failover://tcp://XXXX:61616";
 
 private static final String SUBJECT = "testQueue";
 
 public static void main(String[] args) throws JMSException, InterruptedException {
 CountDownLatch latch = new CountDownLatch(1);
 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(BROKER_URL);
 Connection connection = connectionFactory.createConnection();
 connection.start();
 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
 Destination destination = session.createQueue(SUBJECT);
 MessageConsumer consumer = session.createConsumer(destination,"JMSXGroupID='GroupB'");
 consumer.setMessageListener(new GroupConsumer2());
 latch.await();
 connection.close();
 }


public void onMessage(Message message) {
TextMessage textMessage = (TextMessage)message;
try {
            LOGGER.info ("get message " + textMessage.getText());
        } catch (JMSException e) {
            LOGGER.error("error {}", e);
        }
}

}

欢迎访问我们的技术交流群425783133

原创粉丝点击