2011-03-02 92 views
1

我一直在讀通過關於RMI在Java教程。我喜歡在這裏列出用於實現遠程接口的方法:RMI - 遠程對象 - 設計問題

http://download.oracle.com/javase/tutorial/rmi/implementing.html

我想知道什麼是兩兩件事:

1)對於在上述鏈接中列出的executeTask方法如果ComputeEngine只是調用任務的執行方法,該設計如何允許遠程對象(任務)訪問某種全局狀態?

2)將在這一設計爲適合於多線程環境?

謝謝確實如此。

回答

1

廣告。 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並在服務器上運行它是非常令人印象深刻的,但不是很安全。

+0

嗨Tomasz,很好的回覆。感謝那。關於第一個答案,如果任務是ComputeEngine私有實例變量,那麼任務如何訪問「globalContext」?如果這是靜態的,會不會更好?再次感謝。 – Joeblackdev

+1

我添加了一個清晰的例子,希望它有幫助。 –

+0

有道理托馬斯,非常感謝你的幫助。問候 – Joeblackdev