ActiveMq簡單的訂閱發佈(消息重發)

Session 中的四種type

  • AUTO_ACKNOWLEDGE=1 自動確認
  • CLIENT_ACKNOWLEDGE=2 客戶端手動確認
  • DUPS_OK_ACKNOWLEDGE=3 自動批量確認
  • SESSION_TRANSACTED =0 事務提交併確認
public class ActiveMQTest {

    // 編寫消息發送方 (生產者)
    @Test
    public void test1() throws JMSException {
        //創建連接工廠對象
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://ip地址:61616");
        //從工廠中獲取一個連接對象
        Connection connection = connectionFactory.createConnection();
        //連接MQ服務
        connection.start();
        //獲取session
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //通過session對象常見Topic
        Topic topic = session.createTopic("MainTopic");
        //通過session對象創建消息的發送者
        MessageProducer producer = session.createProducer(topic);
        //通過session 創建消息對象
        TextMessage message = session.createTextMessage("ping111");
        //發送消息
        producer.send(message);
        //關閉相關資源
        producer.close();
        session.close();
        connection.close();

    }

    // 編寫消息接受方 (消費者)
    @Test
    public void test2() throws JMSException {
        //創建連接工廠對象
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://ip地址:61616");
        //從工廠中獲取一個連接對象
        Connection connection = connectionFactory.createConnection();
        //連接MQ服務
        connection.start();
        //獲取session
        final Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
        //通過session對象常見Topic
        Topic topic = session.createTopic("MainTopic");
        //通過session對象創建消息的發送者
        MessageConsumer consumer = session.createConsumer(topic);
        //指定消息監聽器
        //當監聽的topic中存在消息,會自動執行
        consumer.setMessageListener(message -> {
            TextMessage textMessage = (TextMessage) message;
            try {
                if (textMessage.getText().equals("ping")){
                    System.err.println("消費者接受到====>>>>> : " + textMessage.getText());
                    //客戶端手動應答
                    message.acknowledge();
                }else {
                    System.err.println("消息處理失敗了。。。");
                    //通知mq進行消息重發,最多重發6次
                    session.recover();
                    //模擬消息處理失敗
                    int i = 1/0;
                }
            } catch (JMSException e) {
                e.printStackTrace();
            }
        });
       while (true){

       }
    }

}

image.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章