遠程方法還可拋出您所需要的任何其他例外,但至少必須拋出RemoteException,這樣您才能處理只會在分布式系統中發生的錯誤狀態。該接口本身支持兩個方法:getPolicy (返回一個實現政策接口的對象),和submitReport (提交一個完成的開支請求,并在報告無論因何種原因使表格出現錯誤時,拋出一個例外)。 政策接口本身可聲明一種使客戶機知道能否在開支報告中添加一個項目的方法: public interface Policy { void checkValid (Expenseentry entry) throws PolicyViolationException; } 如果該項目有效--即符合當前政策,則該方法可正常返回。否則就會拋出一個描述該錯誤的例外。政策接口是本地的(而非遠程的),所以將通過本機對象在客戶機上執行--在客戶機的虛擬機上,而非整個網絡上運行的對象。客戶機可能運行下列程序: Policy curPolicy = server.getPolicy(); start a new expense report show the GUI to the user while (user keeps adding entries) { try { curPolicy.checkValid(entry); // throws exception if not OK add the entry to the expense report } catch (PolicyViolationException e) { show the error to the user } } server.submitReport(report);
當用戶請求客戶機軟件啟動一份新的開支報告時,客戶機就調用server.getPolicy,并要求服務器返回一個包含當前開支政策的對象。 添加的每個項目首先都被提交給該政策對象,以獲得批準。如果政策對象報告無錯誤,則該項目就被添加到報告中;否則錯誤就被顯示給用戶,而后者可采取修正措施。當用戶完成向報告中添加項目時,整個報告就被呈交。服務程序如下: import java.rmi. *; import java.rmi.server. *; class ExpenseServerImpl extends UnicastRemoteObject implements ExpenseServer { ExpenseServerImpl() throws RemoteException { // . . . set up server state . . . } public Policy getPolicy() { return new TodaysPolicy(); } public void submitReport(ExpenseReport report) { // . . . write the report into the db . . . } } 除基本程序包外,我們還輸入RMI的服務程序包。類型UnicastRemoteObject 定義了此服務程序遠程對象的類型,在本例中,應為單一服務程序而非復制服務(下面還會詳細介紹)。Java類ExpenseSeverImpl實現遠程接ExpenseServer的方法。遠程主機的客戶機可使用RMI將信息發送給ExpenseServerImpl對象。