1. 程式人生 > 實用技巧 >如何保證訊息的可靠性

如何保證訊息的可靠性

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完成");
    }
}

這樣就可以完成微信公眾號樣的功能了