2013-01-23 108 views
0

我正在使用weblogic 10.3。 我試圖配置一個持久的消息,由jdbc存儲支持(在Oracle數據庫中)的持久訂閱。我有一個MDB正在傾聽的主題是持久訂閱者。 在情景-1下:如果我發送消息,它會擊中MDB。JMS持久訂閱者持久性消息不會持久存在數據庫中

在情景-2下:我暫停了MDB,希望郵件發送到主題時只要它們不被MDB(這是唯一註冊的持久訂閱者)所使用,就會停留在周圍。但是當我將消息發送給主題時,它會在那裏簡要顯示,然後消失(我使用HermesJMS來看它)。

我的印象是,由於MDB沒有使用這些消息,因此在這種情況下會記錄到JDBC存儲中,但是oracle db中的WLSTORE表並沒有得到任何消息。

我後來發現消息顯示在主題>持久訂閱者>在管理控制檯中顯示消息。

因此,顯然發生了什麼事情是主題不保留消息,而是在其下面註冊的持久訂閱保留它,直到消息消耗完。

問題-1)但是消息不會去基於Oracle的jdbc存儲的事實仍然沒有意義?我在這裏做錯了什麼?

問題-2)即使當我恢復MDB開始偵聽郵件時,該主題仍然顯示持久訂閱者(管理控制檯)下的所有郵件仍然完好無損 - 我希望他們會從那裏移除因爲他們被唯一註冊的耐用用戶處理。

回答

1

消息不會顯示在主題中,因爲主題和隊列是不同的通信模型。假設您擁有2個(持久)訂閱者的持久主題:A和B.您希望他們兩個都能獲取該消息。爲了確保A和B都必須確認他們收到了該消息。 這也是爲什麼你重新獲得所有消息的原因,重新連接之後,你的MDB必須調用消息的commit(),告訴服務器它已完成處理。 這也解釋了爲什麼話題本身不存儲消息,它們存儲在每個耐用消費者中。因爲A可能會提交該消息,但B不會(可能是「脫機」)。所以你需要爲每個消費者提供一份副本。

0

我發現一對夫婦在進一步測試有趣的事情 -

問題1)_即使我沒有在WebLogic 10配置JDBC存儲的JMS服務器,它有自己的默認文件存儲其中始終工作,沒有任何配置。該文件存儲用於存儲持久訂閱的持久性消息,並且該存儲將在整個服務器重新啓動時保留消息。

更多閱讀 - http://docs.oracle.com/cd/E17904_01/web.1111/e13701/store.htm#i1130575

問題2)_我的MDB期待在某些格式的XML消息,我的測試過程中讓事情變得簡單,我開始向小短信和忘記,他們將不會得到處理成功地在MDB中。因此MDB無法處理所有這些消息,並且回滾事務,這就是爲什麼當我恢復MDB時消息永遠不會被刪除。

這幾乎可以解答我的兩個問題。