您的位置:首页 > 编程语言 > Java开发

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文件,我这里写到了



配置如下:

<?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>


分析一下repository 值是从哪里来的:





将配置好的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