如何保證訊息的可靠性
阿新 • • 發佈:2020-08-11
JMS 可靠性:Persistent 永續性,事務, Acknowledge 簽收
持久化
// 在佇列為目的地的時候持久化訊息
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
// 佇列為目的地的非持久化訊息
messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT)
持久化的訊息,伺服器宕機後訊息依舊存在,只是沒有入隊,當伺服器再次啟動時,訊息就會被消費
但是非持久化的訊息,伺服器宕機後訊息永遠丟失,而當你沒有註明是否是持久化還是非持久化時,預設是持久化的訊息。
對於目的地為主題(topic)來說,預設就是非持久化的。
讓主題的訂閱支援化的意義在於,對於訂閱了公眾號的人來說,當用戶手機關機,在開機後就可以接受到關注公眾號之前傳送的訊息。
消費者
public class JmsConsumer_Topic_Delivery { public static final String ACTIVEMQ_URL = "tcp://112.124.20.231:61616"; public static final String TOPIC_NAME = "topic01"; public static void main(String[] args) throws JMSException, IOException { System.out.println("我是1號消費者王五"); //1.建立連線工廠,按照給定的URL,採用預設的使用者名稱密碼 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); //2.通過連線工廠,獲得connection並啟動訪問 Connection connection = activeMQConnectionFactory.createConnection(); connection.setClientID("王五"); //3.建立會話session //兩個引數transacted=事務,acknowledgeMode=確認模式(簽收) Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //4.建立目的地(具體是佇列queue還是主題topic) Topic topic = session.createTopic(TOPIC_NAME); TopicSubscriber topicSubscriber = session.createDurableSubscriber(topic, "我是王五"); //啟動連線 connection.start(); Message message = topicSubscriber.receive();//一直等 while (message != null) { TextMessage textMessage = (TextMessage) message; System.out.println("收到的持久化 topic:"+textMessage.getText()); message = topicSubscriber.receive(3000L);//等3秒後message為空,控制檯關閉。 } } }
生產者
public class JmsProducer_Topic_Delivery { public static final String ACTIVEMQ_URL = "tcp://112.124.20.231:61616"; public static final String TOPIC_NAME = "topic01"; public static void main(String[] args) throws Exception{ //1.建立連線工廠,按照給定的URL,採用預設的使用者名稱密碼 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); //2.通過連線工廠,獲得connection並啟動訪問 Connection connection = activeMQConnectionFactory.createConnection(); connection.start(); //3.建立會話session //兩個引數transacted=事務,acknowledgeMode=確認模式(簽收) Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //4.建立目的地(具體是佇列queue還是主題topic) Topic topic = session.createTopic(TOPIC_NAME); //5.建立訊息的生產者 MessageProducer messageProducer = session.createProducer(topic); //設定持久化topic再啟動 messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT); connection.start(); //6.通過使用訊息生產者,生產三條訊息,傳送到MQ的佇列裡面 for (int i = 1; i < 4; i++) { //7.通過session建立訊息 TextMessage textMessage = session.createTextMessage("TOPIC_NAME---" + i); //8.使用指定好目的地的訊息生產者傳送訊息 messageProducer.send(textMessage); } //9.關閉資源 messageProducer.close(); session.close(); connection.close(); System.out.println("****TOPIC_NAME訊息釋出到MQ完成"); } }
這樣就可以完成微信公眾號樣的功能了