首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >drools-6 ( kie )从kie工作台部署的工件中自动扫描模块和会话。

drools-6 ( kie )从kie工作台部署的工件中自动扫描模块和会话。
EN

Stack Overflow用户
提问于 2014-01-23 08:49:04
回答 4查看 7.4K关注 0票数 8

我正在尝试构建一个web (Spring)应用程序,通过注入集成kie (drools 6)。我已经使用kie工作台创建了一个工作流,并进行了编译和部署。我在我的项目的pom.xml中添加了这个工件的引用,并按照这篇博客文章添加了本地kie-工作台存储库,并且它工作得很好(在maven/spring项目中将工件作为依赖项提取)。我想要做的是在我的一个服务中注入kiesession作为依赖项,下面是代码片段-

代码语言:javascript
复制
@Service
public class TniServiceImpl implements TniService {

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

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

  1. spring真的支持CDI注入吗?我是否必须配置kmodules和kession显式如前所述
  2. 我是不是漏掉了什么东西,可以让扫描和注入工作?

我的环境是-

  1. Spring3.2.6-发行版(包括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配置文件中显式定义所有k模块/ksession之外,我将非常感激。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-03-13 11:30:35

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

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

TniServiceImpl.java

代码语言:javascript
复制
@Service
public class TniServiceImpl implements TniService {

  @Inject 
  ApplicationContext context; 

  KieSession kieSession;

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

root-context.xml

代码语言:javascript
复制
   <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。

代码语言:javascript
复制
@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();
            ...
    }
}
票数 4
EN

Stack Overflow用户

发布于 2014-03-21 21:43:06

以上的答案并不适用于spring。我发现这是现有drools中的一个bug,他们正在下一个版本中修复它。由于我在批处理模式中使用DROOLS,所以我在这一点上陷入困境,但我希望它能够在websphere上托管的REST服务中使用。上面的解决方案在批处理程序中完美地工作。

票数 0
EN

Stack Overflow用户

发布于 2017-06-16 20:13:05

这就是我所使用的最新的Spring (Spring )

代码语言:javascript
复制
@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

代码语言:javascript
复制
<kbase name="DroolDemoKbase" packages="rules">
    <ksession name="DroolDemoSession" />
</kbase>

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

代码语言:javascript
复制
@Autowired
private KieSession kieSession;
    kieSession.fireAllRules();

希望这能帮助那些仍有问题的人

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21303349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档