您的位置:首页 > 移动开发 > WebAPP

Drools项目发布成Web服务

2014-07-13 21:02 357 查看
最近应项目的要求,开始研究Drools规则引擎。

作为规则引擎,一个比较通用的应用方式就是开放服务接口,以供其它模块或用户调用。发布成Web服务无疑是比较理想的方法。Drools项目发布成Web服务,也就是实现以Web服务的方式调用Drools引擎,目前的资料相对比较少。但Drools作为开源项目,目前官方采用Maven组织它的项目工程,利用官方插件创建的Drools工程也是Maven工程。所以只要扩展这个Maven工程,加入Web服务相关内容并开放接口即可。利用Maven项目开发Web服务的资料还是很多的,但不能简单的照搬,因为Drools工程和普通Maven工程相比有很多自己独有的东西。

我采用的Drools引擎版本:6.0.1Final,使用CXF框架开发Web服务。

首先要说明的是,不建议采用官方插件创建的Drools工程开发Web服务,因为对Maven工程进行扩展的常用方法是在pom.xml里添加新的依赖,这是非常方便且有效的方法。而官方插件创建的Drools工程虽然也是Maven工程,却没有pom.xml文件,这会带来很多不便。事实上没有这个文件,扩展其它的功能也很麻烦。相应的替代方法是,创建普通的Maven工程,并把它扩展成Drools工程,再开发Web服务。

1、在pom.xml里添加CXF依赖和配置jetty插件

<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>apache-cxf</artifactId>
<version>2.7.0</version>
<type>pom</type>
</dependency>


我使用的CXF版本为2.7.0,最新发布的为3.0。

2、编写服务类代码

3、扩展Maven工程为Maven web工程

(1)在pom.xml里设置工程的打包方式为war

(2)在项目属性的project facets里增加Dynamic Web Module。注意选上时会出现Further configuration available提示,点击后在出现的对话框里设置Content directory的值为src/main/webapp(可选,但推荐,这是Maven web工程的理想组织形式),并选择Generate web.xml deployment descriptor,让其在WEB-INF目录下生成一个web.xml文件

(3)在项目属性的Deployment Assembly里检查是否有maven dependencies,如果没有请添加。因为我们要使用web工程,web工程发布是要包含所有引用外部库,而Maven默认情况下只是增加这些库的引用,并没有把库拷进工程,这样可以减小工程大小,但发布web时必须要包含进来。如果这一步忘了做,最后调用服务时很可能会出现很多ClassNotFoundException甚至其他奇怪的错误。

4、在webapp中发布Web服务

CXF提供了spring的集成,同时还提供了CXFServlet用于在web容器中发布WebService。 增加了apache-cxf的依赖会自动增加对spring的引用。只需要写配置文件。

(1)在WEB-INF目录(此时Eclipse可能会把它显示在Deployed Resources下)创建并编写服务配置XML文件

文件名可任取,但配置web.xml时会用到。文件内容

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" >
<jaxws:endpoint id="XXX" implementor="YYY" address="/ZZZ" />
</beans>
其中XXX是服务终结点的ID,YYY是前面编写的服务实现类,ZZZ是对应服务地址。即配置完后,部署运行时对应服务地址为/XXX/ZZZ。
(2)在web.xml中配置CXFServlet和spring的ContextLoaderListener

<pre name="code" class="html"><servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>



<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/XXX.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
XXX即刚才创建的服务配置文件名称

至此服务已经发布,部署后,应该可以访问相关服务的WSDL,并使用工具(如Eclipse自带的Websevice Explorer)测试Web服务。如果测试成功,应该会显示正确的返回信息,并且命令行中有相应提示,表明Drools已经成功调用。

当然这里只是利用Web服务调用Drools引擎。真正功能完备的实现应该包含诸如把特定的规则文件作为输入并让Drools返回处理结果。还有这里也只开放了SOAP服务接口,REST接口也是今后可以考虑的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息