扩展Axis2框架,支持基于JVM的剧本语言
副标题#e#
本文先容了如何扩展Axis2框架,以支持Jython、JRuby等基于Java虚拟机(JVM)的剧本语言。文章对这一主题举办了高条理概述,包罗 Apache Axis2的一些要害观念,以及如何操作Axis2为基于JVM的剧本语言提供扩展。读完此文,开拓人员可以扩展Axis2框架,来支持基于JVM的剧本语言。Axis2框架扩展之后,可以轻松做到如下两点:
将剧本开拓为Web处事。
用所选的剧本语言编写处事客户端。
Apache Axis2是开源的Web处事引擎。它对应用遍及的Apache Axis SOAP仓库举办了彻底的从头设计和编写。Axis2不只能为Web应用添加Web处事接口,还能作为独立的处事器应用运转。Apache Axis2支持SOAP协议,也支持备受接待的REST气势气魄Web处事。利用Axis2,你可以将业务逻辑实现袒露为WS-*气势气魄的接口,与此同时,也可以将该实现袒露为REST/POX气势气魄的接口。
设计JVM的初志仅仅是为了支持Java编程语言。但跟着时间的流逝,越来越多的语言移植到了Java平台,个中包罗许多剧本语言。JVM此刻支持诸多剧本语言,好比Jython、JRuby、ColdFusion等。简朴起见,本文选择了Jython,不外描写的技能同样合用于其他语言。
Jython是Python编程语言的Java实现。它取Java、Python两者之所长,是这两种语言的殽杂编程。由于Jython是完全用 Java编写的,所以用Jython编写的剧本能运行在任何兼容的JVM上,并能利用现有的Java库(这些Java库得是Python模块)。
Web处事的实现要领
Web处事是构建面向处事的体系架构(SOA)的一组技能。尽量SOA和Web处事之间的干系凡是很容易夹杂,但Web处事是一种实现技能,它回收尺度协议来执行SOA,领略这一点很重要。开拓Web处事的技能中,利用较为遍及的两种是代码优先和契约优先:
利用代码优先的要领,主要存眷点是给出代码;你要先编写Java代码,再按照Java代码生成Web处事契约(WSDL)。对比之下,契约优先强调的则是处事契约;你先编写WSDL契约,然后利用Java或代码生成东西实现该契约。契约优先的要领有一些长处,它能促进:
应用之间的松散耦合
多个处事之间的互操纵性
抽象的利用,从而埋没底层的实现细节
所有参加方之间的协作和一致的告竣
代码优先的要领例有如下优势:
简朴、省时
能将遗留系统袒露为Web处事
不消深入相识WSDL的相关常识
这就是说,在设计处事契约时,你可以在代码优先和契约优先两种技能中择其一。最终的抉择则取决于你是更想确保互操纵性,照旧更想提跨越产力。本文将展示如何扩展Apache Axis2,使其对两种方法都举办支持。
扩展Axis2框架,以支持代码优先
Axis2包括一个基于XML的客户端API,成果甚为强大。这个API可用来开拓Java处事客户端。此刻的需求是用剧本语言编写处事客户端,我们选择Jython举办演示。
要让Jython与Axis2客户端库协作,我们需要开拓Axis2客户端API的包装库。开拓该包装库的目标是在现有成果主体之上建设一个抽象层。此时,我们要从头界说Axis2客户端API的接口,使其能接管Jython剧本。
#p#副标题#e#
上图显示了API的架构。当执行Jython客户端剧本时,会建设并执行一个相映射的Java处事客户端。接着会举办Web处事挪用,将功效返回给客户端剧本。
通过客户端API发送SOAP动静时,会激活输出管道(Out Pipe)。输出管道将挪用各个处理惩罚器,最终由传输发送者(Transport Sender)把SOAP动静发送给方针端点。SOAP动静由传输吸收者(Transport Receiver)吸收,传输吸收者会读取SOAP动静、启动输入管道(In Pipe)。输入管道由一些处理惩罚器构成,终端是Jython动静吸收者(Message Receiver),Jython动静吸收者会消费SOAP动静,并把它交给应用。
下面的代码片断展示了挪用Web处事的Jython客户端。
from org.wso2.wsf.jython.client import WSClient
from org.wso2.wsf.jython.client import WSFault
from org.wso2.wsf.jython.client import WSMessage
req_payload_string = "<webSearch><appid>ApacheRestDemo</appid><query>Sri Lanka</query><form/></webSearch>"
LOG_FILE_NAME = "/home/heshan/IdeaProjects/MRclient/src/jython_yahoo.log"
END_POINT = "http://search.yahooapis.com/WebSearchService/V1/webSearch"
try
client = WSClient({ "to" : END_POINT,
"http_method" : "GET",
"use_soap" : "false"},
LOG_FILE_NAME)
req_message = WSMessage(req_payload_string, {})
print " Sending OM : " , req_payload_string
res_message = client.request(req_message)
print " Response Message: " , res_message
except WSFault, e:
e.printStackTrace();
扩展Axis2框架,以支持契约优先
Axis2代码生成器
#p#分页标题#e#
提到代码生成,Axis2含有一个代码生成模块——Axis2代码生成器(Axis2 Code Generator)。代码生成器能归并多个数据绑定框架,并且易于扩展。因此代码生成东西可以举办扩展,以支持剧本语言。在深入扩展东西的细节之前,让我们先看看Axis2的代码生成器。
考量SOAP处理惩罚引擎时,一个要害的附加代价就是基于WSDL的代码生成。代码生成要能:
为用户提供利便——代码生成东西要辅佐用户以简朴、有效的方法利用框架。
充实操作框架。
此刻来看看Axis2代码生成器的架构。
东西的架构很是简朴。焦点部门会处理惩罚WSDL文件、生成工具模子。然后按照模板理会生成的工具模子、生成源代码。
扩展Axis2的代码生成器,从而支持剧本语言
代码生成引擎逐个挪用扩展,最终会挪用组件Emitter。Emitter是代码生成流程中处理惩罚重要事情的真正组件。Emitter凡是与语言相关,因此语言和Emitter是一一关联的。所以我们要有一个支持Jython代码生成的Emitter。上图说明白这一简朴但成果强大的架构。
Emitter处理惩罚WSDL、生成工具模子。工具模子只不外是个XML文件,内里包括针对WSDL、关于Axis2信息模子(即Axis处事、Axis操纵、Axis动静等)的工具模子。模板是XSLT文件,含有如何生成代码的信息。最后,生成的工具模子会按照模板举办理会、生成Jython源代码。
要支持契约优先的要领,需要为处事生成一个框架、一个动静吸收者。已经写好的通用动静吸收者运转不了,它只能在有限的Schema布局上运行。我们可以操作Axis2现有的基本设施来做到这一点。Axis2建设了一个暗示WSDL的中间XML布局,我们必需按照该XML布局运行两个XSLT文件,来生成框架类和动静吸收者。有了这些XSLT文件和代码生成东西,我们就能用Jython支持契约优先的Web处事了。最后,就可以利用动静吸收者和框架来编写Jython实现的处事客户端了。
处事器端
本节将接头如何将业务逻辑袒露为Web处事。
要在Axis2中袒露Jython实现的Web处事,可以从Axis2可插拔陈设器的观念中找找办理方案。为了袒露用Jython编写的处事,我们要编写一个自界说的陈设器、一个Jython动静吸收者。
动静吸收者消费SOAP动静,并把SOAP动静传给应用。动静吸收者是输入管道中最后一个处理惩罚器。
陈设器需要将Jython的数据范例映射到XML Schema数据范例。这个进程称为数据绑定。然后借助数据绑定和要领注解,就能为Jython处事生成XML Schema了。接下来,生成的XML Schema和有关AxisService的元数据城市交给Axis2引擎。Axis2引擎将建设出对应的WSDL,Jython处事也会被袒露为Web 处事。
上图展示了该办理方案的架构。传输监听器(Transport Listener)吸收传入的SOAP动静,并将动静传给处理惩罚器链。接着,SOAP动静交由Jython动静吸收者处理惩罚,动静吸收者会遍历Axis工具模子(AXIOM)的布局、检索相关的信息。检索到的信息再通报给Jython处事。然后Jython处事开始执行,生成的功效再返回给Jython动静吸收者。Jython动静吸收者会为返回的Jython工具建设一个AXIOM布局。接下来,响应经过处理惩罚器链发送给传输发送者。传输发送者再将响应发送给客户端。对每个互换的SOAP动静来说,前面所述的进程城市执行一遍。
如何陈设Jython处事
陈设时,Axis2引擎会读取Jython剧本的注解,并完成动态Jython范例到静态Java范例的映射。这一进程称为数据绑定。相应的匹配范例映射完成之后,会建设处事的XML Schema。下面的步调描写了如何生成Jython处事的XML Schema:
读取Jython处事的注解。
为Jython处事建设AxisService。
给每个Jython要领建设一个AxisOperation。
给操纵增加AxisMessage。AxisMessage包括要领参数的范例。
将所有AxisOperation添加到AxisService中。
最终为Jython动静生成XML Schema。
生成的AxisService会交给Axis2引擎。最后由Axis2引擎生成WSDL。
结论
Apache Axis2可以以这种方法举办扩展,来支持基于JVM的剧本语言。扩展之后,用户就可以袒露处事、用JVM剧本语言扩展编写处事客户端了。
关于作者
#p#分页标题#e#
Heshan Suriyaarachchi是WSO2公司的一名软件工程师,是WSO2企业处事总线(ESB)团队的成员。Heshan具备Web处事、SOA、中间件和漫衍式系统的相关履历。他喜欢打篮球,业余时间还参加开源项目。
他的博客是:http://heshans.blogspot.com/
查察英文原文:http://www.infoq.com/articles/axis2_scripting