drools-6(kie)自动扫描(从春季开始)模块和来自kie workbench部署工件的会话

Avn*_*ish 8 spring drools jbpm kie

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

@Service
public class TniServiceImpl implements TniService {

@Inject
@KSession("tniSession")
private KieSession tniSession;
...
}
Run Code Online (Sandbox Code Playgroud)

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

  1. 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.

Per*_*zzo 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"); 
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

根上下文.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" />
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。

更新:

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

@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();
            ...
    }
}
Run Code Online (Sandbox Code Playgroud)