日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

通向架构师的道路(第十一天)之Axis2 Web Service(二)

發布時間:2024/4/14 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通向架构师的道路(第十一天)之Axis2 Web Service(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、總結前一天

前一天中我們講述了如何生成一個Axis2的WebService, 如何布署以及4種不同的客戶端, 它們是: 傳統式, 非阻塞式, 雙工模式, 雙工非阻塞。

并且我們看到了一個Axis2的Web Service的布署描述:

<service name="HelloWorld">

???????? <parameter name="ServiceClass">org.sky.axis2.helloworld.HelloWorld</parameter>

??? <operation name="sayHello">

<messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>

??????? <actionMapping>urn:sayHello</actionMapping>

??? </operation>

</service>

這個描述代表我們的這個Web Service的方法有一進一出兩個參數,且是Axis2特有的” OMElement”類型。

那么,我們想要一個public String sayHello(String name)這樣的一種簡單的Java類型來書寫我們的WebService可以嗎?

當然,只不過我們的布署描述和我們的客戶端調用返回值上稍稍有一些不一樣。

二、使用簡單Java類型書寫我們的WebService

HelloJava類:

package org.sky.axis2.helloworld.javatype;

import javax.xml.stream.XMLStreamException;

import org.apache.axiom.om.OMElement;

public class HelloJava {

???????? public String sayHello(String name) throws XMLStreamException {

?????????????????? StringBuffer hello = new StringBuffer();

?????????????????? hello.append("hello: ");

?????????????????? hello.append(name);

?????????????????? return hello.toString();

???????? }

}

Service描述文件:

此時我們相應的布署文件就是service.xml文件內容稍稍不一樣,來看

<service name="HelloJava">

???????? <parameter name="ServiceClass" locked="false">

?????????????????? org.sky.axis2.helloworld.javatype.HelloJava

???????? </parameter>

???????? <messageReceivers>

?????????????????? <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"

??????????????????????????? class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />

???????? </messageReceivers>

???????? <actionMapping>urn:sayHello</actionMapping>

</service>

我們把這個WebService布署入Tomcat后啟動起來看

是不是多了一個Service叫”HelloJava”。

我們把這個Service的wsdl地址導入SOAP UI工具并生成模擬客戶端,然后再來看看它的調用與返回值。

注意這個返回值:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

?? <soapenv:Body>

????? <ns:sayHelloResponse xmlns:ns="http://javatype.helloworld.axis2.sky.org">

????????<ns:return>hello: Simon Shen</ns:return>

????? </ns:sayHelloResponse>

?? </soapenv:Body>

</soapenv:Envelope>

標有紅色加粗的部分,反正一粗,就有用就是好東西(我喜歡粗,YEAH)。

再來比較一下昨天我們用“org.apache.axis2.receivers.RawXMLINOutMessageReceiver”這個Service描述生成的返回值

org.apache.axis2.receivers.RawXMLINOutMessageReceiver

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

?? <soapenv:Body>

????? <hel:sayHello xmlns:hel="http://helloworld.axis2.sky.org">

???????? <!--Optional:-->

?????????<hel:sayHello>Monica</hel:sayHello>

????? </hel:sayHello>

?? </soapenv:Body>

</soapenv:Envelope>

看到區別沒有?于是,更改我們的客戶端調用代碼如下,在此我們使用異步雙工模式:

org.sky.axis2.helloworld.javatype.HelloJavaWithReturnDualNonBlock

package org.sky.axis2.helloworld.javatype;

import org.apache.axiom.om.OMAbstractFactory;

import org.apache.axiom.om.OMElement;

import org.apache.axiom.om.OMFactory;

import org.apache.axiom.om.OMNamespace;

import org.apache.axis2.AxisFault;

import org.apache.axis2.Constants;

import org.apache.axis2.addressing.EndpointReference;

import org.apache.axis2.client.Options;

import org.apache.axis2.client.ServiceClient;

import org.apache.axis2.context.ConfigurationContext;

import org.apache.axis2.context.ConfigurationContextFactory;

public class HelloJavaWithReturnDualNonBlock {

???????? private static EndpointReference targetEPR = new EndpointReference(

??????????????????????????? "http://localhost:8080/Axis2Service/services/HelloJava");

???????? public static boolean finish = false;

???????? public void sayHello() {

?????????????????? OMFactory fac = OMAbstractFactory.getOMFactory();

?????????????????? OMNamespace omNs = fac.createOMNamespace(

???????????????????????????????????? "http://javatype.helloworld.axis2.sky.org", "");

?????????????????? OMElement method = fac.createOMElement("sayHello", omNs);

?????????????????? OMElement name = fac.createOMElement("name", omNs);

?????????????????? name.setText("ymk");

?????????????????? method.addChild(name);

?????????????????? method.build();

?????????????????? Options options = new Options();

?????????????????? options.setTo(targetEPR);

?????????????????? options.setTransportInProtocol(Constants.TRANSPORT_HTTP);

?????????????????? options.setUseSeparateListener(true);

?????????????????? options.setAction("urn:sayHello");

?????????????????? ServiceClient sender = null;

???????????????????HelloJavaNonBlockCB callback = new HelloJavaNonBlockCB();

?????????????????? try {

??????????????????????????? sender = new ServiceClient();

??????????????????????????? sender.engageModule(Constants.MODULE_ADDRESSING);

??????????????????????????? sender.setOptions(options);

??????????????????????????? sender.sendReceiveNonBlocking(method, callback);

??????????????????????????? synchronized (callback) {

???????????????????????????????????? try {

????????????????????????????????????????????? callback.wait();

???????????????????????????????????? } catch (InterruptedException e) {

?????????????????????????????????????????????? e.printStackTrace();

???????????????????????????????????? }

??????????????????????????? }

?????????????????? } catch (Exception e) {

??????????????????????????? e.printStackTrace();

?????????????????? } finally {

??????????????????????????? try {

???????????????????????????????????? sender.cleanup();

??????????????????????????? } catch (Exception e) {

??????????????????????????? }

?????????????????? }

???????? }

???????? public static void main(String[] args) {

?????????????????? HelloJavaWithReturnDualNonBlock testClient = new HelloJavaWithReturnDualNonBlock();

?????????????????? testClient.sayHello();

???????? }

}

相關的CallBack類,org.sky.axis2.helloworld.javatype.HelloJavaNonBlockCB

package org.sky.axis2.helloworld.javatype;

import java.util.Iterator;

import javax.xml.namespace.QName;

import org.apache.axiom.om.OMElement;

import org.apache.axiom.om.OMNode;

import org.apache.axis2.client.async.AxisCallback;

import org.apache.axis2.context.MessageContext;

import org.apache.axis2.databinding.utils.BeanUtil;

import org.apache.axis2.engine.DefaultObjectSupplier;

public class HelloJavaNonBlockCB implements AxisCallback {

???????? private boolean complete = false;

???????? public void onMessage(MessageContext msgContext) {

?????????????????? System.out.println(msgContext.getEnvelope().getBody());

?????????????????? OMElement element = msgContext.getEnvelope().getBody()

???????????????????????????????????? .getFirstElement();

???????????????????OMElement result = element.getFirstChildWithName(new QName(

?????????????????????????????????????"http://javatype.helloworld.axis2.sky.org", "return"));

?????????????????? System.out.println(result.getText());

?????????????????? synchronized (this) {

??????????????????????????? this.notify();

?????????????????? }

???????? }

???????? public boolean isComplete() {

?????????????????? return complete;

???????? }

???????? public void onFault(MessageContext msgContext) {

?????????????????? System.out.println(msgContext.getEnvelope().getBody().getFault()

???????????????????????????????????? .toString());

?????????????????? synchronized (this) {

??????????????????????????? this.notify();

?????????????????? }

???????? }

???????? public void onError(Exception e) {

?????????????????? e.printStackTrace();

?????????????????? synchronized (this) {

??????????????????????????? this.notify();

?????????????????? }

???????? }

???????? public void onComplete() {

?????????????????? this.complete = true;

?????????????????? synchronized (this) {

??????????????????????????? this.notify();

?????????????????? }

???????? }

}

下面是客戶端運行后的輸出:

注意在CallBack類中的這一句:

OMElement result = element.getFirstChildWithName(new QName(

?????????????????????????????????????"http://javatype.helloworld.axis2.sky.org","return"));

和下面這個SOAP UI的返回值來作個比較“注意這個Return

<ns:return>hello: Simon Shen</ns:return>

三、深入理解Axis2的API的寫法

我們一邊看著SOAP UI給我們生成的調用端和結果來看這些個API。

Axis2中的一切都是一種OMElement,它其實就是一個“XML”結構的Java對象。

3.1?先來看調用端的生成

下面是Soap UI幫我們生成的客戶端

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:jav="http://javatype.helloworld.axis2.sky.org">

?? <soapenv:Header/>

?? <soapenv:Body>

????? <jav:sayHello>

???????? <!--Optional:-->

???????? <jav:name>Simon Shen</jav:name>

????? </jav:sayHello>

?? </soapenv:Body>

</soapenv:Envelope>

通過上述的內容我們可以知道,調用一個以wsdl方式暴露的Web Service的客戶端需要下面這些元素:

1)????? 調用地址 end point

private static EndpointReference targetEPR = new EndpointReference(

??????????????????? "http://localhost:8080/Axis2Service/services/HelloJava");

2)????? Web Service方法,注意service.xml描述中的這一行

<actionMapping>urn:sayHello</actionMapping>

這個被稱為我們的Web Method,它指向了我們在類中的:

public String sayHello(String name) throws XMLStreamException {

該方法有一個返回,一個進參,返回已經我們的service.xml描述中用:

<messageReceivers>

??????????? <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"

???????????????????? class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />

</messageReceivers>

它的進參我們假設是一個String類型的。

這樣一個Web Method的原始調用(其實我們把它稱為SOAP調用)應該是如SOAP UI工具中給我們生成的語句那樣:

<jav:sayHello>

???????? <!--Optional:-->

???????? <jav:name>Simon Shen</jav:name>

??? </jav:sayHello>

因此,為了生成上述的SOAP語句,我們采Axis2的API書寫如下,下面的代碼的效果將會在程序運行時產生等同于上面的SOAP調用語句,一起來看看:

OMFactory fac = OMAbstractFactory.getOMFactory();

?????????? OMNamespace omNs = fac.createOMNamespace(

???????????????????????????? "http://javatype.helloworld.axis2.sky.org", "");

?????????? OMElement method = fac.createOMElement("sayHello", omNs);

?????????? OMElement name = fac.createOMElement("name", omNs);

?????????? name.setText("ymk");

?????????? method.addChild(name);

???????????????????method.build();

當”method.build()”命令發出后,上述這些API就生成SOAP調用語句,去調用”sayHello”這個方法,然后往里面傳入了一個String類型的值。

可以看到,這個API非常像dom4j的語句,只是這邊不是一個document類型而是一個類XML的OMElement結構體,都是addChild, setText之類的,對吧?

再繼續往下看我們的API

Options options = new Options();

?????????? options.setTo(targetEPR);

?????????? options.setTransportInProtocol(Constants.TRANSPORT_HTTP);

?????????? options.setUseSeparateListener(true);

?????????????????? options.setAction("urn:sayHello");

1)????? 將該web method的調用指向指定的end point

2)????? 開啟雙工模式

3)????? 因為是雙工模式,需要在client端開啟一個監聽器

4)????? 設置調用的web method為”urn:sayHello”

sender = new ServiceClient();

??????????????????????????? sender.engageModule(Constants.MODULE_ADDRESSING);

??????????????????????????? sender.setOptions(options);

??????????????????????????? sender.sendReceiveNonBlocking(method, callback);

1)????? 生成調用句柄

2)????? 由于我們采用的是雙工模式,因此需要尋址:engageModule

這個engageModule就是需要訪問你的工程的WEB-INF\modules\目錄下的一個叫addressing-1.4.mar的文件。

因此在調用engageModule語句之間有兩種方式來調用你的WEB-INF\modules目錄下的addressing-1.4.mar文件。

第一種方式:

ConfigurationContext sysContext = ConfigurationContextFactory

?????????????????????????????????????? .createConfigurationContextFromFileSystem(

???????????????????????????????????????????????????????? "D:\\wspace\\Axis2Service\\WebContent\\WEB-INF",

???????????????????????????????????????????????????????? null);

????????????????????sender = new ServiceClient(sysContext, null);

??????????????????????????? sender.engageModule(Constants.MODULE_ADDRESSING);

第二種方式:

sender = new ServiceClient(sysContext, null);

???????? sender.engageModule(Constants.MODULE_ADDRESSING);

在第二種方式中,不需要為new ServiceClient()指定第一個sysContext參數,但是,你必須把WEB-INF\modules\addressing-1.4.mar指定到你的工程的classpath中去,如下圖


要不然運行時會拋出下面這個exception:

org.apache.axis2.AxisFault:Unable to engage module : addressing

1)????? 使用非阻塞方式調用:sendReceiveNonBlocking(方法, callback類)

最后我們在CallBack具體的實類中我們巧妙使用了線程的wait()和notify()來實現“阻塞”。

3.2?再來看如何解析返回的值

由于返回的值也是一個OMElement結構體,來看SOAP UI工具中給我們生成的返回結果

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

?? <soapenv:Body>

????? <ns:sayHelloResponse xmlns:ns="http://javatype.helloworld.axis2.sky.org">

???????? <ns:return>hello: Simon Shen</ns:return>

????? </ns:sayHelloResponse>

?? </soapenv:Body>

</soapenv:Envelope>



其實,我們需要做的就是解析這個SOAP的返回包(soap response)。

public void onMessage(MessageContext msgContext) {

?????????????????? System.out.println(msgContext.getEnvelope().getBody());

?????????????????? OMElement element = msgContext.getEnvelope().getBody()

???????????????????????????????????? .getFirstElement();

?????????????????? OMElement result = element.getFirstChildWithName(new QName(

???????????????????????????????????? "http://javatype.helloworld.axis2.sky.org", "return"));

?????????????????? System.out.println(result.getText());

?????????????????? synchronized (this) {

??????????????????????????? this.notify();

?????????????????? }

}

在SOAP的世界中,這個namespace很重要,相當于一個頭標記,如果我們在調用下面這句話時

OMElement result = element.getFirstChildWithName(new QName(

???????????????????????????????????? "http://javatype.helloworld.axis2.sky.org", "return"));

沒有加http://javatype.helloworld.axis2.sky.org,那么這段soapresponse將無法被正確定位到

<ns:return>hello: Simon Shen</ns:return>

那么你將得到NullPointerException。

相信,經過這樣的講解,因該能夠使你看得懂一個Axis2的API客戶端了吧,從此處我們可以發覺,很多語句都是“固化”的,和EJB的調用一樣,一堆固化的語句,寫多了,理解起來就并不難了,呵呵。

四、復雜類型的Webservice

更多的時候,我們的Service需要返回類似于List<Person>, List<String>這樣的數據結構,因為有時我們先要在server端通過數據庫取值,然后再把值返回給客戶端,我們就一起來看如何生成一個具有復雜類型的Web Service以及它相應的客戶端調用的寫法吧。

下面是Service端:

org.sky.axis2.javacomplextype.PersonService

package org.sky.axis2.javacomplextype;

import org.apache.axiom.om.OMElement;

import org.apache.axis2.databinding.utils.BeanUtil;

import java.util.*;

import javax.xml.namespace.QName;

public class PersonService {

???????? public OMElement getPersons(OMElement person) {

?????????????????? Person man = new Person();

?????????????????? List<Person> list = new ArrayList<Person>();

?????????????????? man.setName("Wallance Shao");

?????????????????? man.setAge("25");

?????????????????? list.add((Person) man.clone());

?????????????????? man.setAge("11");

?????????????????? man.setName("Hong Wayne");

?????????????????? list.add((Person) man.clone());

?????????????????? OMElement omElement = BeanUtil.getOMElement(new QName("root"),

???????????????????????????????????? list.toArray(), new QName("person"), false, null);

?????????????????? return omElement;

???????? }

}

它生成了一個List<Person>的復雜類型,它的返回類型必須為OMElement結構,下面再來看Person.java類:

org.sky.axis2.javacomplextype.Person

package org.sky.axis2.javacomplextype;

import java.io.*;

public class Person implements Serializable,Cloneable{

???????? private String name="";

???????? private String age="";

???????? public String getName() {

?????????????????? return name;

???????? }

???????? public void setName(String name) {

?????????????????? this.name = name;

???????? }

???????? public String getAge() {

?????????????????? return age;

???????? }

???????? public void setAge(String age) {

?????????????????? this.age = age;

???????? }

???????? public Object clone(){

?????????????????? Object o = null;

?????????????????? try{

??????????????????????????? o=super.clone();

?????????????????? }catch(Exception e){

??????????????????????????? e.printStackTrace();

??????????????????????????? o=null;

?????????????????? }

?????????????????? return o;

???????? }

}

然后我們編寫我們的service.xml文件

它的內容如下:

<service name="PersonService">

???????? <parameter name="ServiceClass">org.sky.axis2.javacomplextype.PersonService</parameter>

??? <operation name="getPersons">

??????? <messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>

??????? <actionMapping>urn:getPersons</actionMapping>

??? </operation>

</service>

把它布署進我們的tomcat,啟動后可以得到一個新的service

書寫我們的客戶端,此處我們使用非阻塞式寫法。

注意:

Server端的Person.java拷貝一份到客戶端的package中去,一定記得,要不然造型時會出錯

org.sky.axis2.javacomplextype.PersonServiceClient

package org.sky.axis2.javacomplextype;

import java.util.Iterator;

import javax.xml.namespace.QName;

import org.apache.axis2.AxisFault;

import org.apache.axis2.Constants;

import org.apache.axis2.addressing.EndpointReference;

import org.apache.axis2.client.Options;

import org.apache.axis2.client.ServiceClient;

import org.apache.axis2.context.ConfigurationContext;

import org.apache.axis2.context.ConfigurationContextFactory;

import org.apache.axiom.om.OMAbstractFactory;

import org.apache.axiom.om.OMElement;

import org.apache.axiom.om.OMFactory;

import org.apache.axiom.om.OMNamespace;

import org.apache.axis2.client.async.AxisCallback;

import org.apache.axis2.context.MessageContext;

public class PersonServiceClient {

???????? private static EndpointReference targetEPR = new EndpointReference(

??????????????????????????? "http://localhost:8080/Axis2Service/services/PersonService");

???????? public void getPersons() {

?????????????????? Options options = new Options();

?????????????????? options.setAction("urn:getPersons");

?????????????????? options.setTo(targetEPR);

?????????????????? options.setTransportInProtocol(Constants.TRANSPORT_HTTP);

?????????????????? options.setUseSeparateListener(true);

?????????????????? ServiceClient sender = null;

?????????????????? try {

??????????????????????????? PersonCallBack callback = new PersonCallBack();

??????????????????????????? sender = new ServiceClient();

??????????????????????????? sender.setOptions(options);

??????????????????????????? sender.engageModule(Constants.MODULE_ADDRESSING);

??????????????????????????? OMFactory fac = OMAbstractFactory.getOMFactory();

??????????????????????????? OMNamespace omNs = fac.createOMNamespace(

?????????????????????????????????????????????? "http://javacomplextype.axis2.sky.org", "");

??????????????????????????? OMElement method = fac.createOMElement("getPersons", omNs);

??????????????????????????? OMElement person = fac.createOMElement("person", omNs);

??????????????????????????? person.setText("");

??????????????????????????? method.addChild(method);

??????????????????????????? sender.sendReceiveNonBlocking(method, callback);

??????????????????????????? synchronized (callback) {

???????????????????????????????????? try {

?????????????????????????????????????????????? callback.wait();

???????????????????????????????????? } catch (InterruptedException e) {

?????????????????????????????????????????????? e.printStackTrace();

???????????????????????????????????? }

??????????????????????????? }

?????????????????? } catch (Exception e) {

??????????????????????????? System.out.println("-------Error Occured-------");

??????????????????????????? e.printStackTrace();

?????????????????? } finally {

??????????????????????????? try {

???????????????????????????????????? sender.cleanup();

??????????????????????????? } catch (Exception e) {

??????????????????????????? }

?????????????????? }

???????? }

???????? public static void main(String[] args) {

?????????????????? PersonServiceClient testClient = new PersonServiceClient();

?????????????????? testClient.getPersons();

???????? }

}

由于是非阻塞式,因此需要寫CallBack具體實現類,下面是我們的CallBack具體實現類,注意紅色加粗部分為我們的核心代碼。

org.sky.axis2.javacomplextype.PersonCallBack

package org.sky.axis2.javacomplextype;

import java.util.Iterator;

import javax.xml.namespace.QName;

import org.apache.axiom.om.OMElement;

import org.apache.axiom.om.OMNode;

import org.apache.axis2.client.async.AxisCallback;

import org.apache.axis2.context.MessageContext;

import org.apache.axis2.databinding.utils.BeanUtil;

import org.apache.axis2.engine.DefaultObjectSupplier;

public class PersonCallBack implements AxisCallback {

???????? public void onMessage(MessageContext msgContext) {

???????????????????OMElement result = msgContext.getEnvelope().getBody().getFirstElement();

???????????????????System.out.println("result====" + result);

???????????????????if (result == null) {

????????????????????????????return;

???????????????????}

???????????????????Iterator iterator = result.getChildElements();

???????????????????while (iterator.hasNext()) {

????????????????????????????OMNode omNode = (OMNode) iterator.next();

????????????????????????????if (omNode.getType() == OMNode.ELEMENT_NODE){

?????????????????????????????????????OMElement omElement = (OMElement) omNode;

?????????????????????????????????????if (omElement.getLocalName().toLowerCase().equals("person")) {

??????????????????????????????????????????????try {

???????????????????????????????????????????????????????Person person = (Person) BeanUtil.processObject(

??????????????????????????????????????????????????????????????????????????omElement, Person.class, null, true,

??????????????????????????????????????????????????????????????????????????new DefaultObjectSupplier());

???????????????????????????????????????????????????????System.out.println("person name=" + person.getName()

??????????????????????????????????????????????????????????????????????????+ " person age=" + person.getAge());

??????????????????????????????????????????????} catch (Exception e) {

???????????????????????????????????????????????????????System.out.println("-------Error Occured-------");

???????????????????????????????????????????????????????e.printStackTrace();

??????????????????????????????????????????????}

???????????????????????????????????? }

??????????????????????????? }

?????????????????? }

?????????????????? synchronized (this) {

??????????????????????????? try {

???????????????????????????????????? this.notify();

??????????????????????????? } catch (Exception e) {

??????????????????????????? }

?????????????????? }

???????? }

???????? public void onFault(MessageContext msgContext) {

?????????????????? System.out.println(msgContext.getEnvelope().getBody().getFault()

???????????????????????????????????? .toString());

?????????????????? synchronized (this) {

??????????????????????????? try {

???????????????????????????????????? this.notify();

??????????????????????????? } catch (Exception e) {

??????????????????????????? }

?????????????????? }

???????? }

???????? public void onError(Exception e) {

?????????????????? synchronized (this) {

??????????????????????????? try {

???????????????????????????????????? this.notify();

??????????????????????????? } catch (Exception ex) {

??????????????????????????? }

?????????????????? }

?????????????????? e.printStackTrace();

???????? }

???????? public void onComplete() {

?????????????????? synchronized (this) {

??????????????????????????? try {

???????????????????????????????????? this.notify();

??????????????????????????? } catch (Exception e) {

??????????????????????????? }

?????????????????? }

???????? }

}

運行我們的PersonServiceClient類,得到輸出如下:

完成我們Axis2的第二天的課程!!!

總結

以上是生活随笔為你收集整理的通向架构师的道路(第十一天)之Axis2 Web Service(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。