使用 JSR 172 JAX-RPC 調用遠程服務一旦生成、編譯並部署了 JSR 172 JAX-RPC 存根和支持文件,消費遠程服務就很容易了。事實上,除了導入 RemoteException,完成最少量的 JAX-RPC 細節初始化工作,您的應用程序不光是看上去,而且運行起來也和非 Web 服務消費者應用程序一樣。由於有 JSR 172 存根和運行時,實現這種簡單的應用程序是可能的,正如前面提到的,JSR 172 存根和運行時把與遠程調用相關的大部分細節都隱藏了。
要調用遠程服務,您首先需要實例化存根,完成最少的存根初始化工作,然後就是如何編寫調用存根方法。下面的代碼片斷顯示了如何使用 JSR 172 JAX-RPC 調用遠程服務。
清單 1:調用遠程服務
package J2MEdeveloper.wsasample
// MIDP
import Javax.microedition.midlet.MIDlet;
import Javax.microedition.lcdui.Display;
import Javax.microedition.lcdui.Form;
...
Form form = new Form("Employee Info");
...
// JAX-RPC
import Java.rmi.RemoteException;
String serviceURL = "www.J2MEdeveloper.com/webservicesample";
...
/**
* Entry point to MIDlet, from start or restart states.
* @throws Javax.microedition.midlet.MIDletStateChangeException
*/
public void startApp() throws MIDletStateChangeException {
// Instantiate the service stub.
EmployeeService_Stub service = new EmployeeService_Stub();
// Initialize the stub/service.
service._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY,
serviceURL);
service._setProperty(Stub.SESSION_MAINTAIN_PROPERTY, new
Boolean(true));
...
display.setCurrent(mainScreen);
}
/**
* Paused state. Release resources (connection, threads, etc).
*/
public void pauseApp() {
...
}
/**
* Destroy state. Release resources (connection, threads, etc).
* @param uc If true when this method is called, the MIDlet must
* cleanup and release all resources. If false the MIDlet may
* throw MIDletStateChangeException to indicate it does not want
* to be destroyed at this time.
* @throws Javax.microedition.midlet.MIDletStateChangeException
* to indicate it does not want to be destroyed at this time.
*/
public void destroyApp(boolean uc) throws MIDletStateChangeException {
...
}
:
:
/**
* Command Listener.
* @param c is the LCDUI Command.
* @param d is the source Displayable.
*/
public void commandAction(Command c, Displayable d) {
if (c == UiConstants.COMMAND_GET_EMPINFO) {
Thread th = new Thread(new GetEmpInfoTask());
th.start();
} else {
...
}
:
:
}
/**
* On its own thread, invoke the remote service getEmployeeInfo
*/
public class GetEmpInfoTask implements Runnable {
public void run() {
try {
// Invoke the remote service.
EmployeeInfo empInfo =
service.getEmployeeInfo(empId);
:
:
// Display the employee Information
form.append("Name:" +
empInfo.firstname+empInfo.lastname);
form.append("Status:"+empInfo.status);
:
:
display.setCurrent(form);
} catch (RemoteException e) {
// Handle RMI exception.
} catch (Exception e) {
// Handle exception.
}
}
}
:
:
注意遠程調用是如何在自己的執行線程中執行的。由於 JSR 172 中的遠程調用是按模塊進行的,而且如果在主事件線程中調用,用戶界面會凍結,直到遠程調用結束。
結束語
本文介紹了用於 J2ME 平台的 JSR 172 WSA,重點介紹了用於 J2ME 遠程服務調用 API 的 JAX-RPC。另外,還涵蓋了 JSR 172 WSA 中用到的核心 Web 服務標准、典型結構以及調用模型。並用一個簡短的代碼實例回顧了如何消費 Web 服務,即 JAX-RPC 子集 API。