Activemq | 面試問題收集

延時投遞的屬性

延遲的時間 ScheduledMessage.AMQ_SCHEDULED_DELAY
重複投遞的時間間隔 ScheduledMessage.AMQ_SCHEDULED_PERIOD
重複投遞的次數 ScheduledMessage.AMQ_SCHEDULED_REPEAT
 try {
            for (int i = 0; i < 3; i++) {
                TextMessage textMessage = session.createTextMessage("tx msg--" + i);
                // 延遲的時間
                textMessage.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, delay);
                // 重複投遞的時間間隔
                textMessage.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, period);
                // 重複投遞的次數
                textMessage.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, repeat);
                // 此處的意思:該條消息,等待10秒,之後每5秒發送一次,重複發送3次。
                messageProducer.send(textMessage);
            }
            System.out.println("消息發送完成");
        } catch (Exception e) {
            e.printStackTrace();

消息消費的重試機制是什麼?

消費者收到消息,之後出現異常了,沒有告訴broker確認收到該消息,broker會嘗試再將該消息發送給消費者。嘗試n次,如果消費者還是沒有確認收到該消息,那麼該消息將被放到死信隊列重,之後broker不會再將該消息發送給消費者。

哪些事件會引發消息重發?

 Client用了transactions且再session中調用了rollback
② Client用了transactions且再調用commit之前關閉或者沒有commit
③ Client再CLIENT_ACKNOWLEDGE的傳遞模式下,session中調用了recover

消息重發時間的間隔與次數
間隔:1
次數:6
每秒發6次

有毒消息Poison ACK
一個消息被redelivedred超過默認的最大重發次數(默認6次)時,消費的回個MQ發一個“poison ack”表示這個消息有毒,告訴broker不要再發了。這個時候broker會把這個消息放到DLQ(私信隊列)。

消費者代碼:

  ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        // 修改默認參數,設置消息消費重試3次
        RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
        redeliveryPolicy.setMaximumRedeliveries(3);
        activeMQConnectionFactory.setRedeliveryPolicy(redeliveryPolicy);
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();
        final Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
        Queue queue = session.createQueue(ACTIVEMQ_QUEUE_NAME);
        MessageConsumer messageConsumer = session.createConsumer(queue);
        messageConsumer.setMessageListener(new MessageListener() {
            public void onMessage(Message message) {
                if (message instanceof TextMessage) {
                    TextMessage textMessage = (TextMessage) message;
                    try {
                        System.out.println("***消費者接收到的消息:   " + textMessage.getText());
                        //session.commit();
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
            }
        });
        System.in.read();

spring整合:
在這裏插入圖片描述
1.消息生產者如何確保消息成功投遞到mq服務器中?
接收回調

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