異步,說到異步需要首先將以下同步。同步就是代碼按照順序執(zhí)行,當(dāng)前面的代碼的請(qǐng)求沒有正常返回結(jié)果的情況下,后面的代碼是不能運(yùn)行。而異步正好和這點(diǎn)不同,異步是代碼運(yùn)行后,不管當(dāng)前的請(qǐng)求是否返回結(jié)果,后面的代碼都會(huì)繼續(xù)運(yùn)行。
代碼
package
com.hoo.service;
/** * <b>function:</b>異步WebService服務(wù)器端代碼 * @author hoojo * @createDate 2011-3-14 上午08:16:59 * @file AsynchronousService.java * @package com.hoo.service * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */
public
class
AsynchronousService {
public
String execute() {
System.out.println("
正在執(zhí)行此代碼……
");
//延遲5秒后,返回結(jié)果
try
{
Thread.sleep(5000);
}
catch
(InterruptedException e) {
e.printStackTrace();
}
return
"
完成
";
}
}
2、 services.xml文件,創(chuàng)建aar文件,然后復(fù)制aar文件到[tomcat-home]\webapps\axis2\WEB-INF\services目錄下
代碼
<
service
name
=
"AsyncService"
>
<
description
>
AsyncService
</
description
>
<
parameter
name
=
"ServiceClass"
>
com.hoo.service.AsynchronousService
</
parameter
>
<
messageReceivers
>
<
messageReceiver
mep
=
"http://www.w3.org/2004/08/wsdl/in-out"
class
=
"org.apache.axis2.rpc.receivers.RPCMessageReceiver"
/>
<
messageReceiver
mep
=
"http://www.w3.org/2004/08/wsdl/in-only"
class
=
"org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"
/>
</
messageReceivers
>
</
service
>
代碼
package
com.hoo.service;
import
java.io.IOException;
import
javax.xml.namespace.QName;
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;
/** * <b>function:</b>異步WebService客戶端代碼 * @author hoojo * @createDate 2011-3-14 上午09:00:03 * @file AsynchronousServiceClient.java * @package com.hoo.service * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */
public
class
AsynchronousServiceClient {
public
static
void
main(String[] args)
throws
IOException {
String target = "
http://localhost:8080/axis2/services/AsyncService?wsdl
";
RPCServiceClient client =
new
RPCServiceClient();
Options options = client.getOptions();
options.setManageSession(
true
);
EndpointReference epr =
new
EndpointReference(target);
options.setTo(epr);
QName qname =
new
QName("
http://service.hoo.com
", "
execute
");
//指定調(diào)用的方法和傳遞參數(shù)數(shù)據(jù),及設(shè)置返回值的類型
client.invokeNonBlocking(qname,
new
Object[] {},
new
AxisCallback() {
public
void
onMessage(MessageContext ctx) {
System.out.println(ctx.getEnvelope());
System.out.println("
Message:
" + ctx.getEnvelope().getFirstElement().getFirstElement().getFirstElement().getText());
}
public
void
onFault(MessageContext ctx) {
}
public
void
onError(Exception ex) {
}
public
void
onComplete() {
}
});
System.out.println("
異步WebService
");
//阻止程序退出
System.in.read();
}
}
上面是異步調(diào)用WebService的代碼,調(diào)用的方法是client.invokeNonBlocking,這個(gè)方法有三個(gè)參數(shù),參數(shù)一是執(zhí)行的方法簽名,參數(shù)二是執(zhí)行該方法的參數(shù),參數(shù)三是異步回調(diào),這里隱式實(shí)現(xiàn)AxiaCallback接口