8

我正在尝试使用通过注入集成的 kie (drools 6) 构建一个 web (spring-mvc) 应用程序。我使用 kie 工作台创建工作流,编译和部署。我在我的项目的 pom.xml 中添加了对这个工件的引用,并根据这篇博客文章添加了本地 kie-workbench 存储库,它工作正常(在我的 maven/spring 项目中将工件作为依赖项拉入)。我想要做的是在我的一项服务中注入 kiesession 作为依赖项,并使用以下代码段 -

@Service
public class TniServiceImpl implements TniService {

@Inject
@KSession("tniSession")
private KieSession tniSession;
...
}

在我的 root-context.xml 中,我添加了 kie 命名空间以及对 xsd 的引用。我添加了 org.kie.spring.KModuleBeanFactoryPostProcessor 以及 per drools 文档。我正在尝试使 CDI 注入为 KSession 扫描和注入工作(它已经在同一个项目中为我的其他组件工作,使用 @Inject)。到目前为止,我总是收到“没有找到依赖项的 [org.kie.api.runtime.KieSession] 类型的合格 bean”错误。看起来 spring 无法扫描其中可用的 kie 模块和会话。在以下方面需要帮助 -

  1. Spring真的支持CDI注入吗?我必须像这里提到的那样明确配置 kmodules 和 kession吗?
  2. 我是否在这里遗漏了一些应该使这种扫描和注入工作的东西?

我的环境如下 -

  1. spring 3.2.6-RELEASE(包括webmvc等组件)
  2. kie-api-6.0.1.FINAL
  3. kie-spring-6.0.1.FINAL
  4. kie-internal-6.0.1.FINAL

我已经浏览了以下链接,但没有运气(大多数情况下他们并没有尝试做我的工作)-

  1. 直接从存储库加载 Drools/KIE Workbench 工件
  2. 为什么将 Drools 6 KIE JAR 加载到代码中失败?

如果有人能指导我这里可能缺少的部分,或者除了在 spring 配置文件中明确定义所有 kmodules/ksessions 之外别无选择,我将不胜感激。

4

4 回答 4

4

我遇到了同样的问题并在这里找到了解决方案:http: //drools.46999.n3.nabble.com/Spring-4-0-amp-Drools-6-0-1-Integration-issue-td4028052.html

基本上你需要注入 ApplicationContext 而不是 kieSession 并手动获取 xml bean。

TniServiceImpl.java

@Service
public class TniServiceImpl implements TniService {

  @Inject 
  ApplicationContext context; 

  KieSession kieSession;

  @PostConstruct 
  public void postConstruct(){ 
    kieSession = (KieSession) context.getBean("ksession1"); 
  }
  ...
}

根上下文.xml

   <kie:kmodule id="kmodule1">
     <kie:kbase name="kbase1">
        <kie:ksession name="ksession1" />
     </kie:kbase>
  </kie:kmodule>
  <bean id="kiePostProcessor" class="org.kie.spring.KModuleBeanFactoryPostProcessor" />

希望这可以帮助。

更新:

实现这一点的另一种方法是保持 xml 相同,而不是尝试注入 KieSession,而是注入 KieBase。然后,使用 KieBase 的实例,创建新的 KieSessions。

@Service
public class TniServiceImpl implements TniService {

    @Autowired
    private KieBase kbase;

    /* inside some method */
    @RequestMapping(method=RequestMethod.GET)
    public @ResponseBody Data getData() {
        KieSession ksession = kbase.newKieSession();
            ...
    }
}
于 2014-03-13T11:30:35.640 回答
0

上面的答案不适用于spring mvc。我发现这是现有 drools 中的一个错误,他们正在下一个版本中修复它。我被困在这一点上,因为我在批处理模式下使用 DROOLS,但我希望它用于托管在 websphere 上的 REST 服务。上述解决方案在批处理程序中完美运行。

于 2014-03-21T21:43:06.883 回答
0

这就是我使用最新的 Spring MVC (Spring Boot) 所做的工作

@SpringBootApplication
public class DroolDemoApplication {

public static void main(String[] args) {
    SpringApplication.run(DroolDemoApplication.class, args);
}

@Bean
public KieContainer kieContainer() {
    return KieServices.Factory.get().getKieClasspathContainer();
}

@Bean
public KieSession kieSession() throws IOException {
    return kieContainer().newKieSession("DroolDemoSession");
}
}

下面是 kmodule.xml

<kbase name="DroolDemoKbase" packages="rules">
    <ksession name="DroolDemoSession" />
</kbase>

最后,您在控制器中所做的就是

@Autowired
private KieSession kieSession;
    kieSession.fireAllRules();

希望这可以帮助那些仍然有问题的人

于 2017-06-16T20:13:05.860 回答
0

我遇到了类似的规则没有被触发的问题,我通过使用and的6.2.0.Final版本解决了这个问题。我尝试了以下版本:、和,但它们都不起作用。kie-cikie-spring7.7.07.2.06.5.06.4.0

...
<properties>
    <kie.version>6.2.0.Final</kie.version>
</properties>
...
<dependencies>
...
<dependency>
    <groupId>org.kie</groupId>
    <artifactId>kie-ci</artifactId>
    <version>${kie.version}</version>
</dependency>
<dependency>
    <groupId>org.kie</groupId>
    <artifactId>kie-spring</artifactId>
    <version>${kie.version}</version>
</dependency>
...
</dependencies>

运行mvn dependency:tree并查看正在使用哪些人工制品/项目的哪些版本也有帮助。

于 2018-06-08T09:06:32.613 回答