簡體   English   中英

如何在Java EE應用程序中並行發送與異步服務的請求並收集響應?

[英]How to send requests parallel to asynchronous services and collect the responses in a Java EE application?

我開發了一個應用程序,該應用程序有時會開始聚合來自一堆服務的信息。 其中一些服務是通過SOAP接口同步調用的,而某些服務則是異步運行的-我必須向JMS隊列Q1發送請求,並在某個時候獲得對Q2的答復。

問題在於該應用程序在一個線程中發送請求,並使用MDB(消息驅動的Bean)對響應進行處理。 從頭開始的解決方案是將已聚合的響應存儲在帶有某些correlationId的某個共享容器中(例如ConcurrentHashMap)。 因此,當MDB獲得響應時,它會查看共享容器,並將響應添加到相應的記錄中。

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

  1. 使用這種方法是否會遇到一些問題? 就像容器將為集群中的每個節點實例化一個一樣。
  2. 還是我可能不小心處理了這么多請求,以至於我將存儲太多響應,從而導致OutOfMemoryError?
  3. 解決此類問題的最佳方法是什么?

讓我回答您的問題:

  1. 對JMS服務調用的響應可以隨時到達(很快就會消失:目標服務器關閉,操作員休息等等)。 因此,您應該在數據聚合期間將請求存儲在數據庫中。
  2. 當您並行處理多個請求時,總是會發生性能問題。 而且,如果您有異步答案,則可以長時間存儲許多哈希值(或使用SFSB激活/鈍化),直到最后一個答案到達為止。 第一個答案(部分)也解決了這個問題,因為它將大多數數據存儲在db中,而僅將當前數據存儲在內存中。 而且更強大。 持久數據可以在服務器崩潰/關閉后幸存下來。
  3. 當您需要數據時,為所有數據庫創建一個數據庫條目,並在標頭中發送請求及其PK。 答案到達時,其標題包含用於標識的相同PK。 MDB是接收它們的最佳方法。 但是使用它們只是為了接收消息。 通過EJB處理其內容。 將消息內容同步委派給EJB,並根據EJB答復確認它們。 在EJB處理的最后,未處理請求的ID屬於當前聚合。 如果沒有人,(從db表中刪除查詢條目,然后)調用相應的EJB(通過MDB?)以處理滿足數據需求的工作。

暫無
暫無

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

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