22、关于Drools Web版本与java实现自动扫描功能
2016-07-26 00:10
681 查看
如何安装workbench 请参考 点击打开链接
通过Drools的 workbeanch 实现与java 的自动扫描功能。具体方式有两种,第一种是ci-api的形式,第二种是Spring整合。
因为workbeanch 与maven 相似,这里的组ID 构建ID 版本号就相当重要了,之前讲说通过直接引用jar的方式去实现web端的一些规则。现在是可以通过ci-api和spring的方式进去访问。
首先我们新建一个项目 这里先用 SNAPSHOT 快照的方式,后面还会再讲到。
编写一个drl文件:
第二步:保存并构建项目
然后我们要进mavne进行配置,这里需要修改settings.xml文件,我这里写到了
配置如下:
分析一下repository 值是从哪里来的:
将配置好的settings.xml 放一份到liunx上的~/.m2/下
workbench所在的linux主机不需要安装maven,也不需要设置maven环境变量,但需要有~/.m2及下面的settings.xml
配置完之后 开始写java代码: 首先第一种方式,通过ci的api直接访问:
分析以上代码:
那我们怎么知道是实现了自动扫描功能呢,很简单,不需要关闭程序,在workbeanch中修改规则文件,并保存重启构建。.
看输出的结果是否有变化,如果没有变化,证明配置失败,如果有变化证明配置成功
上面代码是通过ci-api的方式实现的。下面我们再说明一下通能srping 方式实现:
要通过spring方式 就要先建立一个xml文件。
xml文件如下内容
配置完之后写java代码:具体代码如下
因为我这里是通过注解的方式引用的。
下面我们说一下有关版本的问题
关于版本的问题,其实写法和mavne是大同小异的,这里我推荐用两种方式 第一可通过LATEST 第二可通过SNAPSHOT
这第一种写法是这样的:将设置的version="" 写成LATEST 及可,简单的说就是将设置版本号的地方写成LATEST
例如<kie:releaseId id="sptringweb" groupId="com.dools.web.test" artifactId="droos_web_class" version="LATEST"/>
这样写的话 在workbeanch中设置版本号是就必须写成 x.y.z 例如:1.6.3 但如果是用这个属性的话,下一次升级时,就要将版本号进行一个累加,举例说明,当前版本号是1.6.8 下一次升级时的值是必须大于1.6.8的
这样才是生效的。
第二种写法就是这样的:将设置的version="" 写成1.6.8-SNAPSHOT及可,这样的写法有一个好处就是可以将当前版本进行覆盖。但有一点的是,必须在设置版本号后面写成如下图这种形式:
以上两种方式已说明了自动扫描和全新的写法。
通过Drools的 workbeanch 实现与java 的自动扫描功能。具体方式有两种,第一种是ci-api的形式,第二种是Spring整合。
因为workbeanch 与maven 相似,这里的组ID 构建ID 版本号就相当重要了,之前讲说通过直接引用jar的方式去实现web端的一些规则。现在是可以通过ci-api和spring的方式进去访问。
首先我们新建一个项目 这里先用 SNAPSHOT 快照的方式,后面还会再讲到。
编写一个drl文件:
第二步:保存并构建项目
然后我们要进mavne进行配置,这里需要修改settings.xml文件,我这里写到了
配置如下:
<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <servers> <server> <id>guvnor-m2-repo</id> <username>drools</username> <!-- 这里是登录的时的帐号密码,如果不设置将没有权限会报错 --> <password>admin</password> <configuration> <wagonProvider>httpclient</wagonProvider> <httpConfiguration> <all> <usePreemptive>true</usePreemptive> </all> </httpConfiguration> </configuration> </server> </servers> <profiles> <profile> <id>guvnor-m2-repo</id> <repositories> <repository> <id>guvnor-m2-repo</id> <name>Guvnor M2 Repo</name> <url>http://10.0.5.141:8080/kie-drools-wb/maven2/</url> <layout>de 4000 fault</layout> <releases> <enabled>true</enabled> <updatePolicy>always</updatePolicy> </releases> <snapshots> <enabled>true</enabled> <updatePolicy>always</updatePolicy> <!--更新策略,常常 --> </snapshots> </repository> </repositories> <activation> <activeByDefault>true</activeByDefault> <!--这里要设置成true --> </activation> </profile> </profiles> <activeProfiles> <activeProfile>guvnor-m2-repo</activeProfile> <!-- 这个设置也是必须要有的 --> </activeProfiles> </settings>
将配置好的settings.xml 放一份到liunx上的~/.m2/下
workbench所在的linux主机不需要安装maven,也不需要设置maven环境变量,但需要有~/.m2及下面的settings.xml
配置完之后 开始写java代码: 首先第一种方式,通过ci的api直接访问:
import org.kie.api.KieServices; import org.kie.api.builder.KieScanner; import org.kie.api.builder.ReleaseId;
@Test public void runRules2() { KieServices kieServices = KieServices.Factory.get(); ReleaseId releaseId = kieServices.newReleaseId("com.dools.web.test", "droos_web_class", "1.6.8-SNAPSHOT"); KieContainer kContainer = kieServices.newKieContainer(releaseId); KieScanner kScanner = kieServices.newKieScanner(kContainer); // Start the KieScanner polling the Maven repository every 10 seconds kScanner.start(10000L); while (true) { try { KieSession kSession = kContainer.newKieSession(); Person p = new Person(); p.setAge(30); p.setName("张三"); kSession.insert(p); kSession.fireAllRules(); System.out.println(p.getName()); Thread.sleep(1000L); } catch (InterruptedException e) { e.printStackTrace(); } } }
</pre>
分析以上代码:
KieServices kieServices = KieServices.Factory.get(); 获取服务不多说了 ReleaseId releaseId = kieServices.newReleaseId("com.dools.web.test", "droos_web_class", "1.6.8-SNAPSHOT"); 后面的参数是不是很眼熟,这里就是在页面中设置的三个参数。 这里通过ReleaseId将这个jar获取到 KieScanner kScanner = kieServices.newKieScanner(kContainer);用于配置扫描间隔 kScanner.start(10000L); 单位是毫秒
那我们怎么知道是实现了自动扫描功能呢,很简单,不需要关闭程序,在workbeanch中修改规则文件,并保存重启构建。.
看输出的结果是否有变化,如果没有变化,证明配置失败,如果有变化证明配置成功
上面代码是通过ci-api的方式实现的。下面我们再说明一下通能srping 方式实现:
要通过spring方式 就要先建立一个xml文件。
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:kie="http://drools.org/schema/kie-spring" xsi:schemaLocation=" http://drools.org/schema/kie-spring http://drools.org/schema/kie-spring.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <kie:kmodule id="kmodule" > <!-- 起名规范就可以 --> <kie:kbase name="kbase" packages="rules.testdrl"><!-- 起名规范就可以 packages=/指到最后一层文件夹/ --> <kie:ksession name="ksession" type="stateful"/> <!-- 起名规则就可以,这个的name 是要在下面的测试类中用到的 --> </kie:kbase> </kie:kmodule> <kie:import releaseId-ref="sptringweb" enableScanner="true" scannerInterval="12000"/> <kie:releaseId id="sptringweb" groupId="com.dools.web.test" artifactId="droos_web_class" version="1.6.8-SNAPSHOT"/> <bean id="kiePostProcessor" class="org.kie.spring.annotations.KModuleAnnotationPostProcessor"/> </beans>
<kie:import releaseId-ref="sptringweb" enableScanner="true" scannerInterval="12000"/> enableScanner表示是否扫描 scannerInterval表示扫描间隔 <kie:releaseId id="sptringweb" groupId="com.dools.web.test" artifactId="droos_web_class" version="1.6.8-SNAPSHOT"/> 这里的配置就多了一个id 这个id 是为了配置kie:import 引用的。
配置完之后写java代码:具体代码如下
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration( { "classpath:spring.xml" }) public class PersonDrools { @KSession("defaultKieSession") @KReleaseId(groupId = "com.dools.web.test", artifactId = "droos_web_class", version = "1.6.8-SNAPSHOT") private KieSession kSession; @Test public void runRules() { while (true) { try { Person p = new Person(); p.setAge(30); p.setName("张三"); kSession.insert(p); int i = kSession.fireAllRules(); System.out.println(p.getName() + i); Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
因为我这里是通过注解的方式引用的。
@KSession("defaultKieSession") //这个我们没有设置kiesession时默认的名字,以后我会讲到如如设置这个属性的 private KieSession kSession; 这里必须要这样写 引用的是private KieSession xxx; 否则不会直接扫描。 @KReleaseId(groupId = "com.dools.web.test", artifactId = "droos_web_class", version = "1.6.8-SNAPSHOT") 这行代码可写可不写,如果不写 就会引用Spring中配置好的,如果要加此行,最好与配置文件中的引用的要完全一样。否则就会替换掉配置文件中的引用,并且不会进行自动扫描。 如果在配置文件未配置kie:improt和 kie:kreleaseId 的话 通过注解也是可以引用到workbeanch的jar包的,但是是不会进行自动扫描的。 从这段话的解释来说。我们可以这样理解 1、在不进行自动扫描 我们可以通过三种方式进行操作,第一种在配置文件中 kie:import 参数只写releaseId-ref第二种不配置xml通过注解的方式引用规则 第三种:通过原生api,不设置扫描kScanner.start(10000L); 2、设置自动扫描的方式,我们有两种方式,上述已经说过,这里不在说明。
下面我们说一下有关版本的问题
关于版本的问题,其实写法和mavne是大同小异的,这里我推荐用两种方式 第一可通过LATEST 第二可通过SNAPSHOT
这第一种写法是这样的:将设置的version="" 写成LATEST 及可,简单的说就是将设置版本号的地方写成LATEST
例如<kie:releaseId id="sptringweb" groupId="com.dools.web.test" artifactId="droos_web_class" version="LATEST"/>
这样写的话 在workbeanch中设置版本号是就必须写成 x.y.z 例如:1.6.3 但如果是用这个属性的话,下一次升级时,就要将版本号进行一个累加,举例说明,当前版本号是1.6.8 下一次升级时的值是必须大于1.6.8的
这样才是生效的。
第二种写法就是这样的:将设置的version="" 写成1.6.8-SNAPSHOT及可,这样的写法有一个好处就是可以将当前版本进行覆盖。但有一点的是,必须在设置版本号后面写成如下图这种形式:
以上两种方式已说明了自动扫描和全新的写法。
相关文章推荐
- Drools 5.5 将支持多个consequences处理
- drools 将添加switch支持
- Drools介绍
- Drools项目发布成Web服务
- 使用drools+freemarker解决非技术人员设计系统业务规则
- Drools 6.0 教程一【在MyEclipse10中的插件安装和Runtimes配置】
- [DROOLS]规则引擎drools常用依赖--Gradle
- 应用drools规则引擎做产生式规则不确定性推理
- 从Drools DSL到antlr
- Eclipse下安装Drools插件
- 事件处理&时空推理(event processing/temporal reasoning)-jboss Drools Fusion
- exception handler in drools rule
- drools rule: stateful vs stateless knowledge session
- Drools(JAVA规则引擎)开发指南
- Drools在Eclipse中环境安装
- Drools规则引擎远程加载规则文件
- Drools规则引擎配置安装
- [Drools]JAVA规则引擎 -- Drools
- Drools学习
- 21、关于Drools Web版本与java实现简单交互