这两天闲来无事,工作比较轻松,于是就学习了下axis2数据绑定端采用了XMLBean,因为工作量太大,所以采用了eclipse插件。关于插件的使用步骤详见http://wso2.org/library/1719
我的客户端采用了xmlbean方法实现,服务器端采用了最简单的pojo其实具体采用pojo xmlbean axiom我觉得不是重点,关键是如何使用工具生成的stub类。我的服务类如下:
package com.cxz.webservice;
public class AsynGreeting {
public String greetings(String name) {
try {
//To show the Asynchronization influence
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Greetings to " + name;
}
}
就是很简单的helloworld,唯一不同的就是加了一个sleep()用来在异步调用中显示作用。
然后利用plugin生成其他部分。
如果客户端采取同步调用,其调用类如下:
package com.cxz.webservice.client;
import java.lang.Exception;
import com.cxz.webservice.GreetingsDocument;
import com.cxz.webservice.GreetingsResponseDocument;
import com.cxz.webservice.GreetingServiceStub;
public class SyncClient {
public static void main(String[] args) {
GreetingServiceStub stub = null;
try {
stub = new GreetingServiceStub();
GreetingsDocument reqDoc = GreetingsDocument.Factory.newInstance();
reqDoc.addNewGreetings();
reqDoc.getGreetings().setName("Bernard");
GreetingsResponseDocument respDoc = stub.greetings(reqDoc);
System.out.println(respDoc.getGreetingsResponse().getReturn());
} catch (Exception e) {
e.printStackTrace();
}
}
}
当然,客户端的数据绑定采用了xmlbean方式。
在实现一部调用之前,要实现一些回雕接口,让axis2框架在完成调用之后自动去调用,该回调类如下:
package com.cxz.webservice.impl;
import com.cxz.webservice.GreetingServiceCallbackHandler;
public class CallbackHandlerImpl extends GreetingServiceCallbackHandler {
public boolean isFinished = false;
public void receiveResultgreetings(
com.cxz.webservice.GreetingsResponseDocument result) {
System.out.println(result.getGreetingsResponse().getReturn());
isFinished = true;
}
public void receiveErrorgreetings(java.lang.Exception e) {
e.printStackTrace();
}
}
下面的部分就是采用异步方式调用的客户端
package com.cxz.webservice.client;
import com.cxz.webservice.GreetingServiceCallbackHandler;
import com.cxz.webservice.GreetingServiceStub;
import com.cxz.webservice.GreetingsDocument;
import com.cxz.webservice.impl.CallbackHandlerImpl;
public class AsynClient {
/**
* @param args
*/
public static void main(String[] args) {
GreetingServiceStub stub = null;
try {
CallbackHandlerImpl callback = new CallbackHandlerImpl();
stub = new GreetingServiceStub();
GreetingsDocument reqDoc = GreetingsDocument.Factory.newInstance();
reqDoc.addNewGreetings();
reqDoc.getGreetings().setName("Bernard");
//GreetingsResponseDocument respDoc = stub.greetings(reqDoc);
//System.out.println(respDoc.getGreetingsResponse().getReturn());
stub.startgreetings(reqDoc, callback);
synchronized(callback){
while(!callback.isFinished){
callback.wait(100l);
}
System.out.println("End");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
异步调用中最重要的是:一定要让main线程保持活动状态,我曾经犯的一个让我很迷惑的错误是:支线程在在完成之前,main线程就结束了,导致非预期结果,让我感到很迷茫,看了网上的一些例子才明白。
还有一点就是那个回调类,一定要重写receiveErrorgreetings()方法,否则不会报任何异常。