欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

扩展ant实现Web Service调用

程序员文章站 2022-07-13 12:14:04
...

背景

NC规则系统需要与持续集成对接,需要在进行持续构造的过程中与Hudson集成,让持续构造工具能够时刻执行规则系统中的规则,并生成结果。

为了满足这个要求,在OSGi端分离了单独的Equinox OSGi容器,把规则执行所使用的bundle部署至容器中,并通过/cxf-dosgi-ri-singlebundle-distributionOSGi中的声明式服务包装,发布成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,即可验证是否可以调用成功。

 

相关标签: ant ws