2009-11-20 34 views
0

我在這裏遇到問題。 我有一個客戶端A通過RMI調用B的代碼。之後,我通過JMS發送一個隊列請求到真正的實現C。但是,我不知道A的「地址」。有沒有辦法以某種方式存儲連接數據,以便我可以稍後將數據返回到A如何在java中存儲rmi連接?

基本上,B可以有大量的請求,並需要將其同步到請求者。怎麼做?

實施例:

答:

... 
    rmiB.HelloWorld("Sys"); 
... 

B:

String HelloWorld(String s) { 
    ... 
    sendToJMS(s); 
    ... 
    return???? 
} 

C:

String HelloWorldOnJMS(String aff) { 
    return "aff+2" 
} 
+0

你的意思是你想讓C的工作結果作爲A的遠程方法調用的結果返回嗎?將數據返回給A的當前接口是什麼? – erickson 2009-11-20 20:18:54

+0

是的,沒錯,我得到B上的一個請求,並在那裏做一些工作,然後發送到JMS隊列到C,我想稍後得到C結果並獲得一個值併發送給A. 基本上我想要有一種方法來回叫A以外的被叫rmi方法。 – 2009-11-20 20:21:09

回答

1

如果無法修改A,然後B需要負責阻斷直到C產生的結果,並且該結果同步作爲RMI方法的結果返回。

這麼看來這個問題更多的是關於如何C可以回覆B(或「BS」,因爲它聽起來像你有這些集羣)不是如何來應對A

正常情況下,類似的同步調用通過JMS在消息上模擬creating a temporary queue,specifying that as the reply address。因此,B會創建一個臨時隊列,然後阻塞該隊列,直到它從C收到結果爲止,然後將回復的內容返回給A

我可能完全不瞭解您的情況,但似乎有其他方法需要修改接口。

+0

絕妙的主意! – 2009-11-20 20:59:00

0

好,因爲A和B已經通過RMI定位器連接,爲什麼不只是有一個regi還有一項服務,然後讓B致電該服務?

+0

嗯,我不能修改A,因爲它是一個客戶端,我不能修改接口。 嗯,我這樣做是因爲在我的B代碼中,我正在平衡服務器。我在那裏爲「客戶」A處理了很多事情。 – 2009-11-20 20:15:46

0

將RMI呼叫轉發給JMSService?聽起來像Apache Camel正是你所需要的;它是進行這種企業集成的框架。

組件page提供瞭如何設置RMI和JMS(以及其他各種)端點的示例。然後,您將使用其強大的DSL編寫路由,將消息從一個端點轉發到另一個端點。

+0

絕對要去看看:3 – 2009-11-20 20:50:03