簡體   English   中英

Weblogic JMS 客戶端 - 從單個事務中的多個隊列讀取

[英]Weblogic JMS client - reading from multiple queues in single transaction

使用來自 WebLogic 11g (WebLogic Server 10.3.6.0) 的 WebLogic JMS 客戶端 (wlthin3client.jar) 在單個事務中從多個 JMS 隊列讀取消息時遇到問題。 我正在嘗試從隊列 Q1 中讀取第一條消息,然后,如果此消息滿足某些要求,則從隊列 Q2 中讀取其他消息(如果當時可用)。

我希望在提交事務后,這兩條消息都應該從 Q1 和 Q2 中消失。 在回滾的情況下 - 消息應保留在 Q1 和 Q2 中。

我的第一種方法是使用異步隊列接收器從 Q1 讀取,然后在需要時從 Q2 同步讀取:

void run() throws JMSException, NamingException {
    QueueConnectionFactory cf = (QueueConnectionFactory) ctx.lookup(connectionFactory);

    // create connection and session
    conn = cf.createQueueConnection();
    session = conn.createQueueSession(true, Session.SESSION_TRANSACTED);
    Queue q1 = (Queue) ctx.lookup(queue1);

    // setup async receiver for Q1
    QueueReceiver q1Receiver = session.createReceiver(q1 );
    q1Receiver.setMessageListener(this);

    conn.start();

    // ...
    // after messages are processed
    conn.close();
}

@Override
public void onMessage(Message q1msg) {
    try {
        QueueReceiver q2receiver = session.createReceiver(queue2);
        if(shouldReadFromQ2(q1msg)){      
           // synchronous receive from Q2
           Message q2msg = q2receiver.receiveNoWait();
           process(q2msg);
        }
        session.commit();
    } catch (JMSException e) {
        e.printStackTrace();
    } finally {
        q2receiver.close();
    }
}

不幸的是,即使我發出session.commit()來自 Q1 的消息仍然未提交。 它處於receive狀態,直到連接或接收器關閉。 然后似乎在它獲得delayed狀態時回滾。

其他觀察:

  1. 如果 Q2 為空並且沒有任何內容可供讀取,則 Q1 消息正確提交。
  2. 當我以類似的嵌套方式為 Q1 和 Q2 使用同步 API 時,問題不會發生。 所以如果我使用q1Receiver.receiveNoWait()一切都很好。
  3. 如果我對 Q1 和 Q2 以類似的嵌套方式使用異步 API,那么只會調用 Q1 消息偵聽器並在 Q1 上提交工作。 但是 Q2 消息偵聽器根本沒有被調用並且 Q2 沒有提交(消息卡在receive / delayed )。

我是否以某種方式濫用了 API? 或者這是 WLS JMS 錯誤? 如何將多個隊列的讀取與異步 API 結合起來?

事實證明這是一個 WLS JMS 錯誤 28637420 錯誤狀態說它已修復,但我不會依賴於此 - 帶有此修復程序的 WLS 11g 補丁不起作用(請參閱 錯誤 29177370 )。

Oracle 表示,發生這種情況是因為兩種不同的交付機制(同步消息與異步消息)並非設計為在同一會話上協同工作。

解決該問題的最簡單方法是在需要在單個會話中處理多個隊列的情況下使用同步 API(輪詢)。 我決定采用這種方法。

oracle 建議的另一種選擇是將 UserTransactions 與兩個不同的會話一起使用,一個會話用於異步消費者,另一個會話用於同步消費者。 不過我沒有測試。

暫無
暫無

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

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