我一直在讀通過關於RMI在Java教程。我喜歡在這裏列出用於實現遠程接口的方法:RMI - 遠程對象 - 設計問題
http://download.oracle.com/javase/tutorial/rmi/implementing.html
我想知道什麼是兩兩件事:
1)對於在上述鏈接中列出的executeTask
方法如果ComputeEngine只是調用任務的執行方法,該設計如何允許遠程對象(任務)訪問某種全局狀態?
2)將在這一設計爲適合於多線程環境?
謝謝確實如此。
我一直在讀通過關於RMI在Java教程。我喜歡在這裏列出用於實現遠程接口的方法:RMI - 遠程對象 - 設計問題
http://download.oracle.com/javase/tutorial/rmi/implementing.html
我想知道什麼是兩兩件事:
1)對於在上述鏈接中列出的executeTask
方法如果ComputeEngine只是調用任務的執行方法,該設計如何允許遠程對象(任務)訪問某種全局狀態?
2)將在這一設計爲適合於多線程環境?
謝謝確實如此。
廣告。 1:請注意,遠程客戶端不知道ComputeEngine
類,只有Compute
接口什麼。另外,服務器實現可能完全改變,但如果接口不改變,客戶端不應該注意。如果你想上下文通過一些從遠程客戶端來的任務,做界面層上:
public class ComputeEngine implements Compute {
private GlobalContext globalContext = //...
public <T> T executeTask(Task<T> t) {
return t.execute(globalContext);
}
這樣,每個任務都有訪問globalContext
,準確地知道從globalContext
會發生什麼(是什麼服務器功能,上下文)。 GlobalContext
將是一個JavaBean或更可能是一些服務接口。
在客戶端,它可能看起來像這樣
Compute compute = //obtain RMI client stub somehow
compute.executeTask(new Task<String>() {
public String execute(GlobalContext globalContext) {
//Note that this code is executed on the server and
//getFoo() is implemented on the server side. We only know its interface
globalContext.getFoo();
//...
}
}
廣告。 2:它將與多個客戶端同時調用服務工作。但是,您需要以線程安全的方式實現服務器。您在線程安全中提到的教程示例,但我的代碼使用GlobalContext
可能不是。請注意,多個客戶端將同時使用globalContext
的相同實例,這可能會導致一些問題,但不會造成一些問題。這可能是最有趣的部分。
終於記住,從遠程客戶端收到未知的Task
並在服務器上運行它是非常令人印象深刻的,但不是很安全。
嗨Tomasz,很好的回覆。感謝那。關於第一個答案,如果任務是ComputeEngine私有實例變量,那麼任務如何訪問「globalContext」?如果這是靜態的,會不會更好?再次感謝。 – Joeblackdev
我添加了一個清晰的例子,希望它有幫助。 –
有道理托馬斯,非常感謝你的幫助。問候 – Joeblackdev