簡體   English   中英

IBM MQQueue 獲取所有消息的最安全方式

[英]IBM MQQueue Safest way to get all messages

我有一個簡單的 java 程序,可以使用 IBM MQ 將消息從隊列 A 傳輸到隊列 B。

我的程序運行良好,但我擔心的是丟失消息。 我知道.get()會從隊列 A 中刪除消息。當然,有一小段時間我從隊列 A 中“獲得”了一條消息,但我還沒有將其放入隊列 B。如果我的程序是在此期間崩潰 - 消息將丟失。

為了解決這個問題,我將當前消息寫入日志。 然后,如果程序崩潰,我們可以手動將消息輸入回隊列。

但是 - 如果程序因IOException崩潰怎么辦? 現在消息從隊列 A 中消失了,沒有在隊列 B 中被.put() ,也沒有被寫入日志。

在我看來,我有兩個選擇:

首先瀏覽消息:我知道我可以在“獲取”消息之前瀏覽消息,盡管我對這如何影響隊列中的消息數量以及是否會創建重復等感到有些困惑。

將消息寫回隊列 A:理論上,如果我們從隊列 A 中“獲取”消息,那么將其“放回”隊列 A 應該沒有問題,如果由於某種原因我們無法連接到隊列 B .

有人可以首先澄清瀏覽消息的正確方法 - 或者提出我沒有想到的第三種選擇?

while (true) {

  try {

    // Clear the MQMessage
    theMessage.messageId = MQConstants.MQMI_NONE;
    theMessage.correlationId = MQConstants.MQCI_NONE;

    // Get the message from queue A
    queueA.get(theMessage, gmo);

    // Read the message from queue A
    byte[] messageBytes = new byte[theMessage.getMessageLength()];
    theMessage.readFully(messageBytes);
    String messageText = new String(messageBytes);

    // Store the message to the logs in case of crash

    // Put the message in queue B
    queueB.put(theMessage);

  } catch (MQException e) {

    // Break the loop if we get an MQException
    // Hopefully, it is a reason code 2033 (out of messages)

  } catch (IOException e) {

    // Something went wrong reading the message

  }
}

通常,如果您想跟蹤讀取和寫入的消息,您應該使用事務性讀/寫。

MQGetMessageOptions gmo = new MQGetMessageOptions();   
gmo.waitInterval = 1000;
gmo.options = MQGMO_WAIT;
gmo.options += MQGMO_FAIL_IF_QUIESCING;
gmo.options += MQGMO_SYNCPOINT;

MQPutMessageOptions pmo = new MQPutMessageOptions();
pmo.options += MQPMO_SYNCPOINT;

// create message instance
MQMessage message = new MQMessage();
message.correlationId = MQCI_NONE;
message.messageId = MQMI_NONE;

// read message
queueA.get(message, gmo);

// write message
queueB.put(message, pmo);

// commit transaction
qmgr.commit();

在這種情況下,如果事務不會被提交,所有讀取的消息將返回源隊列,所有寫入的消息將從目標隊列中消失。 最好不要提交每條消息,而是每 10 條或 100 條,具體取決於它們的數量。

如果您不打算使用分布式事務(例如,將一些信息從 MQ 消息保存到數據庫),那就足夠了。 否則我建議切換到 JMS,因為它有更好的事務支持。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM