ActiveMQ之Topic的持久订阅

非持久化订阅持续到它们订阅对象的生命周期。这意味着,客户端只能在订阅者活动时看到相关主题发布的消息。如果订阅者不活动,它会错过相关主题的消息。如果花费较大的开销,订阅者可以被定义为durable(持久化的)。持久化的订阅者注册一个带有JMS保持的唯一标识的持久化订阅(subscription)。带有相同标识的后续订阅者会再续前一个订阅者的订阅状态。如果持久化订阅没有活动的订阅者,JMS会保持订阅消息,直到消息被订阅接收或者过期。

代码如下:

生产者:

 
  1. package cn.slimsmart.activemq.demo.topic;

  2.  
  3. import javax.jms.Connection;

  4. import javax.jms.DeliveryMode;

  5. import javax.jms.JMSException;

  6. import javax.jms.MessageProducer;

  7. import javax.jms.Session;

  8. import javax.jms.TextMessage;

  9. import javax.jms.Topic;

  10.  
  11. import org.apache.activemq.ActiveMQConnectionFactory;

  12.  
  13. public class Producer {

  14.  
  15. public static void main(String[] args) throws JMSException {

  16. // 连接到ActiveMQ服务器

  17. ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.18.43:61616");

  18. Connection connection = factory.createConnection();

  19. connection.start();

  20. Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);

  21. // 创建主题

  22. Topic topic = session.createTopic("slimsmart.topic.test");

  23. MessageProducer producer = session.createProducer(topic);

  24. // NON_PERSISTENT 非持久化 PERSISTENT 持久化,发送消息时用使用持久模式

  25. producer.setDeliveryMode(DeliveryMode.PERSISTENT);

  26. TextMessage message = session.createTextMessage();

  27. message.setText("topic 消息。");

  28. message.setStringProperty("property", "消息Property");

  29. // 发布主题消息

  30. producer.send(message);

  31. System.out.println("Sent message: " + message.getText());

  32. session.commit();

  33. session.close();

  34. connection.close();

  35. }

  36. }

消费者:

 
  1. package cn.slimsmart.activemq.demo.topic;

  2.  
  3. import javax.jms.Connection;

  4. import javax.jms.JMSException;

  5. import javax.jms.Message;

  6. import javax.jms.MessageConsumer;

  7. import javax.jms.MessageListener;

  8. import javax.jms.Session;

  9. import javax.jms.TextMessage;

  10. import javax.jms.Topic;

  11.  
  12. import org.apache.activemq.ActiveMQConnectionFactory;

  13.  
  14. /**

  15. * 持久订阅设置唯一的客户端ID和订阅者ID。

  16. */

  17. public class ConsumerPersistent {

  18.  
  19. public static void main(String[] args) throws JMSException {

  20. String clientId = "client_id";

  21.  
  22. // 连接到ActiveMQ服务器

  23. ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.18.43:61616");

  24. Connection connection = factory.createConnection();

  25. //客户端ID,持久订阅需要设置

  26. connection.setClientID(clientId);

  27. connection.start();

  28. Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);

  29. // 创建主题

  30. Topic topic = session.createTopic("slimsmart.topic.test");

  31. // 创建持久订阅,指定客户端ID。

  32. MessageConsumer consumer = session.createDurableSubscriber(topic,clientId);

  33. consumer.setMessageListener(new MessageListener() {

  34. // 订阅接收方法

  35. public void onMessage(Message message) {

  36. TextMessage tm = (TextMessage) message;

  37. try {

  38. System.out.println("Received message: " + tm.getText()+":"+tm.getStringProperty("property"));

  39. } catch (JMSException e) {

  40. e.printStackTrace();

  41. }

  42. }

  43. });

  44.  
  45. }

  46. }

注:

1.activemq区分消费者,是通过clientID和订阅客户名称来区分的。

2.消息的生产者,发送消息时用使用持久模式。
3.使用相同的“clientID”,则认为是同一个消费者。两个程序使用相同的“clientID”,则同时只能有一个连接到activemq,第二个连接的会报错。
4.activemq的设置在conf/activemq.xml中,默认消息是保存在data/kahadb中,重启activemq消息不会丢。

猜你喜欢

转载自blog.csdn.net/wuyongde0922/article/details/81414155
今日推荐