異步,說到異步需要首先將以下同步。同步就是代碼按照順序執行,當前面的代碼的請求沒有正常返回結果的情況下,后面的代碼是不能運行。而異步正好和這點不同,異步是代碼運行后,不管當前的請求是否返回結果,后面的代碼都會繼續運行。
代碼
package
com.hoo.service;
/** * <b>function:</b>異步WebService服務器端代碼 * @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("
正在執行此代碼……
");
//延遲5秒后,返回結果
try
{
Thread.sleep(5000);
}
catch
(InterruptedException e) {
e.printStackTrace();
}
return
"
完成
";
}
}
2、 services.xml文件,創建aar文件,然后復制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
");
//指定調用的方法和傳遞參數數據,及設置返回值的類型
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();
}
}
上面是異步調用WebService的代碼,調用的方法是client.invokeNonBlocking,這個方法有三個參數,參數一是執行的方法簽名,參數二是執行該方法的參數,參數三是異步回調,這里隱式實現AxiaCallback接口