2017-03-24 52 views
0

我開發了一個應用程序,在某些時候開始聚集一堆服務的信息。其中一些服務是通過SOAP接口同步調用的,其中一些服務異步工作 - 我必須發送請求到JMS隊列Q1,並在某個時候獲得Q2的答案。如何發送與異步服務並行的請求並在Java EE應用程序中收集響應?

問題是應用程序在一個線程中發送請求,並使用MDB(消息驅動Bean)處理響應。我的頭頂上的解決方案是將一些共享容器(如ConcurrentHashMap)中的聚合響應與一些correlationId一起存儲。所以當一個MDB獲得響應時,它會查看共享容器並將響應添加到相應的記錄中。

該應用程序在域HA模式下的WildFly AS上運行。

  1. 是否有一些問題可以用這種方法解決?就像容器將爲羣集中的每個節點實例化一樣。
  2. 或者我可以意外地處理這麼多的請求,我會存儲這麼多的響應,我會得到OutOfMemoryError?
  3. 這種問題的最佳方法是什麼?

回答

0

我來回答你的問題:

  1. 到JMS服務呼叫的響應,隨時都可能(非常快:在目標服務器關閉,操作員休息一下,等)到達。因此,您應該在數據聚合期間將請求存儲在數據庫中。
  2. 當您並行處理多個請求時,總會發生性能問題。如果你有異步的答案,你可以長時間存儲很多哈希(或者用SFSB激活/鈍化),直到最後一個答案到達。第一個答案(部分)也解決了這個問題,因爲它將大部分數據存儲在數據庫中,並只將當前數據存儲在內存中。而且更健壯。持久的數據在服務器崩潰/關機後仍能存活。
  3. 當你需要這些數據時,爲所有人創建一個數據庫條目,並用標題中的PK發出請求。當答案到達時,其標題包含用於標識的相同PK。 MDB是接收它們的最佳方式。但是使用它們只是爲了接收消息。通過EJB處理其內容。將消息內容同步委派給EJB並根據EJB答案進行確認。在EJB處理提取的最後,未處理請求的ID屬於當前聚合。如果沒有人(從db表中刪除查詢條目並且)調用相應的EJB(通過MDB?)以滿足數據需求繼續工作。
+0

將工作委託給ejb有什麼意義?無論如何,我無法承認這個消息,直到ejb完成。此外,我不能存儲id,因爲它不是用id的東西,它是計算的結果。所以我應該保存完整的對象。 – fantomasdnb

+0

EJB處理是同步的,消息確認取決於EJB方法的結果。該ID是表的主鍵,由JMS消息發送並返回(MDB)。 –

+0

雖然你的話有一些意義,但我不認爲你明白這個問題 – fantomasdnb

相關問題