activemq group分组

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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值