目的:调用invokeNonBlocking方法,然后初步认识下soap消息。
在编写客户端代码时应注意如下几点:
1. 客户端代码需要引用很多Axis2的jar包,如果读者不太清楚要引用哪个jar包,可以在Eclipse的工程中引用Axis2发行包的lib目录中的所有jar包。
2 在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,也就是<wsdl:definitions>元素的targetNamespace属性值,下面是SimpleService类生成的WSDL文件的代码片段:
MyServer代码如下:
- import org.apache.axiom.om.OMAbstractFactory;
- import org.apache.axiom.om.OMElement;
- import org.apache.axiom.om.OMFactory;
- import org.apache.axiom.om.OMNamespace;
- public class MyServer {
- public String sayGoodMorning(){
- System.out.println("正在执行sayGoodMorning");
- try {
- Thread.sleep(5000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- return "good morning teacher";
- }
- }
把.class文件放到 webapps/axis2/WEB-INF/pojo里
启动tomca,http://localhost:9080/axis2/services/MyServer?wsdl能否访问
客户端测试;
- import java.io.IOException;
- import javax.xml.namespace.QName;
- import org.apache.axis2.AxisFault;
- import org.apache.axis2.addressing.EndpointReference;
- import org.apache.axis2.client.Options;
- import org.apache.axis2.client.async.AxisCallback;
- import org.apache.axis2.context.MessageContext;
- import org.apache.axis2.rpc.client.RPCServiceClient;
- public class TestClient {
- public static void main(String[] args) {
- String urlString="http://localhost:9080/axis2/services/MyServer?wsdl";
- try {
- //使用RPC方法调用
- RPCServiceClient client=new RPCServiceClient();
- Options options = client.getOptions();
- //指定调用webservice的URL
- options.setTo(new EndpointReference(urlString));
- QName qName2=new QName("http://ws.apache.org/axis2","sayGoodMorning");
- client.invokeNonBlocking(qName2, new Object[]{},new AxisCallback() {
- @Override
- public void onComplete() {
- System.out.println("onComplete");
- }
- @Override
- public void onError(Exception arg0) {
- System.out.println("onError");
- }
- @Override
- public void onFault(MessageContext arg0) {
- System.out.println("onFault");
- }
- @Override
- public void onMessage(MessageContext arg0) {
- //获得返回的soap消息
- System.out.println(arg0.getEnvelope().toString());
- //解析soap,获得返回结果
- System.out.println(arg0.getEnvelope().getFirstElement().getFirstElement().getFirstElement().getText());
- }
- });
- } catch (AxisFault e) {
- e.printStackTrace();
- }
- try {
- System.in.read();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
控制台打印:
<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><ns:sayGoodMorningResponse xmlns:ns="http://ws.apache.org/axis2"><return>good morning teacher</return></ns:sayGoodMorningResponse></soapenv:Body></soapenv:Envelope>
good morning teacher
onComplete