在java中使用axis创建异步请求的最有效方法是什么?

时间:2014-01-31 11:50:47

标签: java multithreading asynchronous axis2

我正在寻找解决此问题的最佳解决方案:

我有一个客户端和一台服务器。

客户端使用call.invoke方法向服务器发送请求。 现在的呼叫是同步的,等待答案。

从负载服务器接收重播的时间大约是1秒(这是很多时间)。

在客户端,我们每秒产生大约50-100个请求的请求,队列正在爆炸。

现在我刚刚创建了一个异步工作的线程池,并将每个线程的请求发送到服务器,但它自己的请求将是同步的。

这意味着如果我们希望线程池能够正常工作,那么线程池应该保持~100个线程。

我不确定这是最好的解决方案。

我还在考虑以某种方式创建一个将发送请求的线程和一个将捕获重放的线程,但是我担心我会将负载传递给服务器端。

很少有重要的事情:

我们无法在服务器端影响代码,也无法控制接收重播所需的时间。

在接收重播时,我们只是使用这些数据创建另一个数据结构并将其传递 - 因此时间戳不是中继重载。

我们使用的是轴api。

任何关于如何解决它的最佳方法的想法? 100线程的线程池似乎没问题?还是有其他方法?

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以通过注册回调实例,使用非阻塞客户端方式调用轴服务。

客户端类:

ServiceClient sc = new ServiceClient();
Options opt= new Options();

//set the target EP
opt.setTo(new EndpointReference("http://localhost:8080/axis2/services/CountryService"));
opt.setAction("urn:getCountryDetails");
sc.setOptions(opt);



sc.sendReceiveNonBlocking(payload, callBack);

//带有axisCallback的内部类,覆盖其所有方法。一旦从后端接收结果

,就会调用onMessage
AxisCallback callBack = new AxisCallback() {

@Override
public void onMessage(MessageContext msgContext) {
    System.out.println(msgContext.getEnvelope().getBody().getFirstElement());
    //this method get called when you received the results from the backend
}
...
}

编写轴服务的参考:http://jayalalk.blogspot.com/2014/01/writing-axis2-services-and-deploying-in.html