首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Axis2 非同步呼叫 Web Service:RPCServiceClient 與 Stub 兩種方式

     編輯:Java 相關知識

同步呼叫會阻塞客戶端執行緒,若服務端處理耗時(如範例中 Thread.sleep(5000)),使用者體驗極差。Axis2 提供兩種非同步機制解決此問題。

服務端:模擬耗時操作

package service;
public class MyService {
    public String getName() {
        System.out.println("getName 正在執行");
        try { Thread.sleep(5000); } catch (Exception ignored) {}
        return "火星";
    }
}

配置同樣使用 RPCMessageReceiver,無特殊設定。

方式一:RPCServiceClient + AxisCallback(程式化)

package client;
import javax.xml.namespace.QName;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.rpc.client.RPCServiceClient;

public class RPCAsyncClient {
    public static void main(String[] args) throws Exception {
        RPCServiceClient client = new RPCServiceClient();
        Options opts = client.getOptions();
        opts.setTo(new EndpointReference("https://localhost:8080/axis2/services/myService"));

        QName op = new QName("https://service", "getName");
        client.invokeNonBlocking(op, new Object[]{}, new org.apache.axis2.client.async.AxisCallback() {
            @Override public void onComplete() {}
            @Override public void onError(Exception e) {}
            @Override public void onFault(MessageContext ctx) {}
            @Override public void onMessage(MessageContext ctx) {
                // 解析回應:Envelope → Body → getNameResponse → return
                System.out.println(ctx.getEnvelope().getFirstElement()
                        .getFirstElement().getFirstElement().getText());
            }
        });

        System.out.println("非同步呼叫已發送!");
        System.in.read(); // 防止主執行緒結束
    }
}

輸出:

非同步呼叫已發送!
火星

方式二:wsdl2java 產生非同步 Stub(建議生產使用)

%AXIS2_HOME%\bin\wsdl2java -uri https://localhost:8080/axis2/services/myService?wsdl \
  -p client -s -a -o stub
  • -s 產生同步 Stub
  • -a 產生非同步 Callback Handler

產生 MyServiceStub 與抽象類 MyServiceCallbackHandler。

客戶端程式碼

package client;
import client.MyServiceStub.GetNameResponse;

class MyCallback extends MyServiceCallbackHandler {
    @Override public void receiveResultgetName(GetNameResponse result) {
        System.out.println(result.get_return());
    }
}

public class StubClient {
    public static void main(String[] args) throws Exception {
        MyServiceStub stub = new MyServiceStub();
        stub.startgetName(new MyCallback());
        System.out.println("非同步呼叫已發送!");
        System.in.read();
    }
}

.NET (C#) 非同步呼叫


// 回調方法
private void getNameCompletedEvent(object sender, WSC.asyn.getNameCompletedEventArgs e) {
    listBox1.Items.Add(e.Result.@return);
}

private void button1_Click(object sender, EventArgs e) {
    async.myService svc = new WSC.async.myService();
    svc.getNameCompleted += getNameCompletedEvent;
    svc.getNameAsync();
    MessageBox.Show("呼叫已發送,UI 未凍結");
}

注意:同一服務實例不可並發呼叫同一方法(會拋例外),需新建實例或等待完成。

選擇建議

場景建議
快速原型、動態端點RPCServiceClient
正式專案、強型別、IDE 提示wsdl2java 產生 Stub
.NET 客戶端原生 async/await 或 Event-based Async Pattern

非同步呼叫是提升 Web Service 客戶端回應性的關鍵,Axis2 同時支援程式化與程式碼產生兩條路徑,按專案需求選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved