用Axis 2提供异步式Web Services

Apache Web Services Wiki上的Stack Comparison(特性比较)表明,目前有Apache的Axis 1.x、Axis2,Metro@GlassFish和Oracle Application Server 10g提供了客户端异步交互和服务器端异步交互。

Apache Axis2是一个开源的Web Services引擎,通过Axis2,开发人员可以使用Java或C来调用或是实现Web Services。Axis2的一个核心特性就是可以提供同步式和异步式的交互,Rajith Attapattu对此解释说:

为同步式和异步式交互提供支持,是Web Services的一个关键性需求,因为这二者都有着非常普遍的应用。Axis2在传输层提供了这一特性,当请求到来后,可以通过同一种或是不同的传输方式来作出异步式响应。例如,如果一个请求通过HTTP到达,而后完成了异步式处理工作,最终的响应可以通过HTTP或是截然不同的传输方式——例如JMS——返回。

Eran Chinthaka的一篇名为“使用Axis2开发异步Web Services(Develop asynchronous Web services with Axis2)”的文章中,提供了一些在客户端和服务器端应用中使用Axis2的异步APIs的示例。

在使用Axis2时,有两种方法可以异步式调用Web Services。第一种方法是使用Nonblocking API,

你可以为客户端提供一个nonblocking API,这样它就可以把请求传递给SOAP引擎,继续做其他工作。客户端会提供一个回调对象,当SOAP引擎从服务器端收到响应时,就会通知这个回调对象。这种方式对使用GUI的交互式应用尤其有效。

Axis2的早期版本中有一个叫做Callback的类,它可以被用来作为异步式消息的回调机制,或是一种轮询(polling)机制。这个类在Axis2 1.3中已经被废弃了,取而代之的是一个简单的接口——AxisCallback。藉由这个新的接口,开发人员可以实现service异步调用过程中的细粒度通知,但它并没有提供Callback类中的轮询机制。

在客户端异步式调用Web Services的第二种方法是在传输层实现的。Eran描述了Axis2提供的传输方式,

所有可以用于Web Services调用中的传输方式可以大致分为两种:
  • 单向传输——提供发送或者接受消息的通道。
  • 双向传输——可以使用一个通道来发送和接收消息。
客户端在处理请求——响应的交互时,可以有多种选 择。最简单的一种就是用类似HTTP的双向传输。但是这种方式没有用到传输层的异步特性。客户端还可以使用两个单向传输或是两个双向传输。例如,你可以用 一个SMTP通道来发送消息,再用另外一个SMTP通道来接收消息。同时,你还可以用一个HTTP通道来发送请求,在消息发出后关闭通道,再使用另外一个 HTTP通道来接受响应。但这就必须要有一种消息关联机制来使这种方式工作。Apache Axis2使用了WS-Addressing规范来实现消息关联。

在Axis2中,用哪一种传输机制都变得非常简单,开发人员所需要做的就是在客户端通过设置useSeparateListener标记来使得双向传输可用。

Apache Axis2在为客户端提供了异步式交互的同时,还提供了服务器端的异步式交互。标准的SOAP引擎通常只是在同一个线程中接受请求并做出响应。基于和客户端同样的原因,在服务器端提供异步式的处理并响应客户端请求也是大有益处的。

Axis2用了一个消息接收器来负责处理MEP,并把消息传送给对请求进行处理的逻辑或是服务实现。在一个同步调用中,消息接收 器会调用服务实现类(假设服务实现是用Java语言编写的)中的正确方法,然后在同一个线程中发送响应。但是在异步调用中,这个消息接收器会启动一个新的 线程来调用服务并向客户端发送通知。这个新的线程负责向客户端发送响应和从服务实现类中获取响应。
有两种方法可以很简单的在服务器端启用异步式交互,一种是在WSDL生成器中使用正确的标记,或是对services.xml进行配置,让它使用 AbstractInOutAsyncMessageReceiver。

Eran Chinthaka在文末总结说:

异步式调用给Web Service的用户或是编写并托管Web Services的人提供了很大的灵活性。越来越多的Web Services变得更加通用,更加复杂,也有越来越多的应用程序把这些Web Services集成到自己的应用中去。因为大多数最终应用基本上都需要和用户交互,所以如何提高用户体验就成了重中之重。在多种层次上——客户端和服务 器端——提供异步式的Web Services调用,可以帮助我们加深对这些目前面临的挑战的认识。
查看英文原文: Using Axis2 for Asynchronous Web Services

你可能感兴趣的:(用Axis 2提供异步式Web Services)