簡體   English   中英

在EJB環境中是否有類似.wait()和.notify()的東西?

[英]Is there something that behaves like .wait() and .notify() in EJB environment?

我知道我不能修改EJB容器中的線程,因此我不知道如何在EJB環境中以正確的方式執行以下操作:

涉及的是

  • 無狀態會話Bean“客戶端”
  • 無狀態會話Bean“服務器”
  • MessageQueue“隊列”
  • 消息驅動Bean“Mdb”處理來自“隊列”的消息
  • n無狀態會話Bean W1到Wn

場景是

客戶端調用服務器方法,然后將幾個消息發送到隊列 之后, Server會做其他一些事情。 在此期間, Mdb消耗一條消息,調用Wi進行一些相當長的計算,並得到結果。 現在Mdb將結果提供給Server 服務器獲取它發送的每條消息的所有“結果”時,它會使用W s的結果進行更多計算,並將結果返回給客戶端

我的問題

在Java SE,我只想做.wait()來讓服務器等待在W S的結果, 服務器沒有發送消息后,下班后。 然后mdb在設置結果時會.notify()。 因為我不能修改EJB容器中的線程,正如規范所述,我迷失了因為我找不到任何適當的方法來在EJB環境中實現相同的行為。

對此問題的任何幫助都將非常感謝,提前感謝。

PS:我正在使用JBoss 5.1.0,以防有任何特定於供應商的措施來解決這個問題。

對此的適當解決方案是用於消息傳遞的“請求/響應”模式。 簡而言之,您可以通過發送消息並等待響應消息來通過消息傳遞系統執行“同步”操作(所有這些在J2EE世界中都是合法的)。 有多種方法可以在實踐中實現這一點,但一般的想法是你發送帶有某種唯一標識符的請求消息,然后使用為你的請求ID設置的消息過濾器等待響應消息已發送(這通常是“correlationId”字段用於)。 MDB將獲取請求消息,處理它們,並使用請求消息中指定的唯一標識符發送響應消息。 您可以使用一個隊列執行所有這些操作,或者您可以使用單獨的請求/響應隊列,或者您可以執行創建“臨時”響應隊列 (每個請求)等瘋狂的操作。 您可以使用Message.setJMSReplyTo方法告訴M​​DB將請求消息發送到何處。

一般模式是:

  1. 客戶端呼叫服務器
  2. 服務器:
    1. 創建消息,設置correlationId和replyTo
    2. 創建QueueSender,發送消息
  3. mdb(對每條消息重復):
    1. 收到消息
    2. 處理消息
    3. 使用correlationId發送響應消息
  4. 服務器:
    1. 使用correlationId創建消息過濾器
    2. 使用消息選擇器創建QueueReceiver
    3. 調用receive()直到收到並處理所有消息(或超時)
    4. 做最后的處理,回應客戶

(顯然,服務器直接從第2步到第4步,我只是用這種方式寫它來突出控制流程。)

什么對象充當MDB返回所有消息的服務器? 它可能需要某種CountDownLatch來等待,消息數量的大小(由MDB改變直到達到零)。 當它變為零時,它將喚醒可以運行返回客戶端的代碼。 請參閱CountDownLatch的API文檔。

暫無
暫無

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

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