扩展ant实现Web Service调用
背景
NC规则系统需要与持续集成对接,需要在进行持续构造的过程中与Hudson集成,让持续构造工具能够时刻执行规则系统中的规则,并生成结果。
为了满足这个要求,在OSGi端分离了单独的Equinox OSGi容器,把规则执行所使用的bundle部署至容器中,并通过/cxf-dosgi-ri-singlebundle-distribution对OSGi中的声明式服务包装,发布成Web Service,供外部调用。
使用客户端对Web Service进行调用
在Web Service发布出来之后,需要使用Apache CXF对生成的Web Service进行客户端调用,在调用之前,需要生成客户端源码,这就需要使用cxf/bin目录下的wsdl2java.bat来生成源码(前提:Web Service服务已打开),执行命令:
wsdl2java.bat –d “生成文件目录” –wsdlurl “对应的wsdl地址,比如 http://localhost:9090/ruleexecute?wsdl”,就可以在对应的生成目录找到源码,将其拷贝进工程目录即可。
如何进行调用?客户端代码如何编写?
public static void main(String[] args) throws Exception { JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance(); Client client = clientFactory.createClient("http://127.0.0.1:9090/ruleexecute?wsdl"); Object[] result = client.invoke("execute", "D:\\Develop\\test\\uap631", "D:\\Develop\\test\\NC_MM_PAC6.31_dev_2\\NC6_MM_VOB\\NC_MM_PAC", "nc631_xxq1227"); System.out.println(result[0]); }
|
其中需要依赖的apache cxf jar包列表如下:
/apache-cxf/lib/cxf-2.7.0.jar /apache-cxf/lib/velocity-1.7.jar /apache-cxf/lib/commons-collections-3.2.1.jar /apache-cxf/lib/commons-lang-2.6.jar /apache-cxf/lib/wsdl4j-1.6.2.jar /apache-cxf/lib/jaxb-xjc-2.2.5.jar /apache-cxf/lib/jaxb-impl-2.2.5.jar /apache-cxf/lib/xmlschema-core-2.0.3.jar /apache-cxf/lib/neethi-3.0.2.jar /apache-cxf/lib/httpcore-4.2.2.jar /apache-cxf/lib/httpcore-nio-4.2.2.jar /apache-cxf/lib/httpasyncclient-4.0-beta3.jar /apache-cxf/lib/httpclient-4.2.1.jar /apache-cxf/lib/commons-logging-1.1.1.jar
|
Ant扩展
由于NC产品构造是采用ant进行构建的,因此需要对ant中的Task进行扩展,以支持在构造的前后都可以对产品的规则进行执行,并得出结果。
如果对Ant进行扩展?首先,我们需要将ant执行中的ant.jar放置在工程中的classpath目录下,由于我们的自定义ant任务就是一个比较简单的Task,并不嵌入其他任务类型,只要从标准的org.apache.tools.ant.Task继承并覆盖execute方法即可。
在ant中配置参数就比较简单了,只需要在对应的Task实现中加入相应字段并生成其set/get方法即可(这里假定所有的字段都是String类型),
public class RuleValidatorAntTask extends Task { private String wsUrl; private String methodName; private String ncHome; private String srcFolder; private String dataSourceName; @Override public void execute() throws BuildException { try { SimpleClient.execute(wsUrl, methodName, ncHome, srcFolder, dataSourceName); } catch (Exception e) { throw new BuildException(e); } } //get/set方法省略… |
Ant部署
在开发完成后,如何对其进行验证,这就需要把我们写的插件部署至ant中,进行执行操作,将工程导出为jar包(注意不需要导出依赖的jar包)。
由于我们刚编写的ant插件依赖了一些cxf的包,这些包也需要单独拿出来,一起部署。将生成的jar包和对应的cxf包统一放置在ant/lib中,由ant进行调用。
Ant中是采用build.xml配置文件的方式进行调用构建的,在build.xml中我们需要先对扩展的任务进行声明后才能使用。
<?xml version="1.0" ?> <project name="testRuleValidator" default="test" basedir="."> <taskdef name="rulevalidator" classname="com.yonyou.nc.codevalidator.runtime.RuleValidatorAntTask" classpath="."/> <target name="test"> <rulevalidator wsUrl="http://127.0.0.1:9090/ruleexecute?wsdl" methodName="execute" ncHome="D:\Develop\test\uap631" srcFolder="D:\Develop\test\NC_MM_PAC6.31_dev_2\NC6_MM_VOB\NC_MM_PAC" dataSourceName="nc631_xxq1227" /> </target> </project> |
<taskdef>标签用来定义对应的执行类名以及简称(rulevalidator),在真正的target中就可以直接使用<rulevalidator>对任务进行调用操作,其中配置的属性和类中定义的属性名称保持一致。
在本目录下的命令行中执行ant,即可验证是否可以调用成功。
推荐阅读
-
利用PHP SOAP扩展实现简单Web Services
-
web前端 - js实现调用window应用
-
扩展ant实现Web Service调用
-
.NET(ASPX) Web Service接口生成及调用
-
【手记】走近科学之为什么明明实现了IEnumerable
的类型却不能调用LINQ扩展方法 -
VB.NET客户端调用Axis的Java Web Service实现文件上传 VBVB.NET.netWebJava
-
通过Web Service实现IP地址查询功能的示例
-
使用ANT实现对web项目的自动更新 编译 打包
-
js实现web调用摄像头 js截取视频画面
-
SpringBoot实现其他普通类调用Spring管理的Service,dao等bean