【问题标题】:Integrating KIE workbench from a Java application从 Java 应用程序集成 KIE 工作台
【发布时间】:2016-08-26 11:18:06
【问题描述】:

我正在尝试将 Drools kie 工作台与 Java 应用程序集成。我使用jboss-as-7.1.1.Final 作为我的工作台。这是规则定义:

package adeveloperdairy.admission;
rule "set isEligible"
ruleflow-group "sample"
lock-on-active true
when
    $p : Student(gpa > 2.0)
then
    System.out.println("GPA is greater than 2..");
    $p.setEligible(true);
end

这是我的 Java 代码:

    String url = "http://localhost:8080/kie-wb-distribution-wars-6.2.0.Final-as7/maven2/adeveloperdiary/Admission/1.0/Admission-1.0.jar";

    String userpassword = "user4:456";
    KieServices ks = KieServices.Factory.get();
    KieRepository kr = ks.getRepository();
    HttpURLConnection http = (HttpURLConnection)new URL(url).openConnection();
    String authEnc = new Base64Encoder().encode(userpassword.getBytes());
    http.setRequestProperty("Authorization", "Basic "+ authEnc);
    InputStream is = http.getInputStream();
    KieModule kModule = kr.addKieModule(ks.getResources().newInputStreamResource(is));

    KieContainer kContainer = ks.newKieContainer(kModule.getReleaseId());
    System.out.println(kModule.getReleaseId().toString());

    KieBase kBase = kContainer.getKieBase();
    System.out.println(kBase.getKiePackages());
    System.out.println(kBase.getKiePackage("adeveloperdiary.admission").getRules());
    KieSession kSession = kBase.newKieSession();

    Student s = new Student();
    s.setName("Raj");
    s.setGpa(5.0f); 
    kSession.insert(s);
    kSession.fireAllRules();

这里是学生 POJO 类:

 package adeveloperdiary.admission;

 /**
 * This class was automatically generated by the data modeler tool.
 */

 public class Student implements java.io.Serializable
{

 static final long serialVersionUID = 1L;

 private java.lang.String name;
 private java.lang.Float gpa;
 private java.lang.Boolean eligible;

 public Student()
 {
 }

 public java.lang.String getName()
 {
  return this.name;
 }

 public void setName(java.lang.String name)
 {
  this.name = name;
 }

 public java.lang.Float getGpa()
 {
  return this.gpa;
 }

 public void setGpa(java.lang.Float gpa)
 {
  this.gpa = gpa;
 }

 public java.lang.Boolean getEligible()
 {
  return this.eligible;
 }

 public void setEligible(java.lang.Boolean eligible)
 {
  this.eligible = eligible;
 }

 public Student(java.lang.String name, java.lang.Float gpa,
     java.lang.Boolean eligible)
 {
  this.name = name;
  this.gpa = gpa;
  this.eligible = eligible;
 }

}

我能够获得 Maven 部署 - adeveloperdiary:Admission:1.0, package - [Package name=adeveloperdiary.admission] 以及规则 - [Rule name=set isEligible,agendaGroup=MAIN,salience=0,no-loop=false]。

但它无法执行规则。可能是我在这里遗漏了一些东西。

【问题讨论】:

  • 你能提供Student POJO 类吗?此外,您尚未将规则放入任何议程组,但您正在寻找 agendaGroup=admission
  • @piyushj 我添加了由 KIE 工作台生成的 Student POJO 类。我已经从规则中删除了议程组(规则流组),现在是“MAIN”。如何从程序执行规则传递数据(gpa 和名称)?
  • 在drl文件中将包名改为adeveloperdiary.admission而不是com.simple
  • 我把它写成“com.simple”只是为了让它听起来很熟悉。但在我的统治下,一切都井井有条。
  • 这里的每个人都很熟悉,这就是我们试图帮助您的原因,但如果输入错误,您会让自己的生活变得更加艰难。

标签: java drools kie


【解决方案1】:

我发现您在 kie 工作台中使用 POJO 类时遇到问题。这是在工作台中导入简单 POJO 并在规则中使用相同的步骤。这已经过测试,最后一次测试可以与 6.4.0.FINAL 版本一起使用

将外部 POJO 模型添加到规则中

workbench项目需要的POJO模型类需要导出为maven jar并上传到workbench。如果不是 maven jar,您可以将其导出到一个简单的 jar。如果您使用的是 eclipse,它是一个简单的导出。

上传POJO模型类jar

  • 在 kie 工作台中,转到创作 -> 工件存储库 -> 上传 -> 浏览到 Jar 并上传
  • 如果 Jar 不包含 pom.xml 文件, 系统将要求您手动输入组和工件 ID。

将模型添加到项目中

  • 导航到项目 -> 打开项目编辑器
  • 在项目编辑器中,从下拉列表中选择依赖项。
  • 从存储库添加 -> 选择模型类 jar 文件。

在规则中添加和使用模型类。

  • 打开引导式规则编辑器 -> 导航到“数据对象”选项卡。
  • 新项目 -> 选择类型。
  • 然后可以在规则编辑器中使用该类型。

【讨论】:

  • 感谢您的回答。我遵循了程序。但是在将外部 jar 添加到项目后,它会显示一个弹出窗口,上面写着“无法完成您的请求。发生以下异常:java.util.zip.ZipException:打开 zip 文件时出错。”你知道为什么它无法打开jar文件吗?而且我没有走最后一步。
  • @Raghu ..哪个步骤给了你上述错误?您是如何创建 Jar 文件的?您是否能够使用一些解压缩工具查看 jar 文件的内容?
  • 在将外部存储库作为依赖项添加到工作台项目后出现此错误。工作台变得非常缓慢。 jar 文件是从 eclipse 中的 maven 项目创建的,解压后我可以看到 jar 的内容。这很好。
  • 事实上,当我尝试从外部存储库导入 Student 类时(在将其作为依赖项添加到项目后),它给出了一个错误:“myDroolsProject.Student 解析为一个包。只能添加类型。”如何克服这个问题?
【解决方案2】:

在您的 DRL 代码中省略 ruleflow-group "sample",然后重试。

您可以使用单个 (!) 规则测试是否会触发正确的规则

rule "hello"
when
then
    System.out.println( "hello" );
end

如果这没有触发,则说明您的设置存在问题。如果触发,则说明您的规则有问题。

【讨论】:

  • 删除了规则流组。但没有运气。我不知道如何使用单(!)规则。无论如何,这无关紧要,因为我只遵循一个规则。你能找出我在代码中哪里出错了..?
  • @Raghu 只需粘贴上述规则而不是您的规则,然后尝试运行您的代码。检查 hello 是否在 java 控制台中打印。
  • 是的,这条规则是从我的 java 程序中触发的。如何为从程序传递事实(数据)的用户定义对象(在本例中为学生)触发规则?
猜你喜欢
  • 2014-09-27
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
相关资源
最近更新 更多