2014-01-23 25 views
8

我想通過注入集成kie(drools 6)來構建一個web(spring-mvc)應用程序。我用kie工作臺創建了一個工作流程,並進行了編譯和部署。我在我的項目的pom.xml中添加了這個工件的引用,並添加了根據this blog post的本地kie-workbench存儲庫,並且它工作正常(在我的maven/spring項目中將工件拉入依賴項中)。我所試圖做的是在注入我的服務之一kiesession與下面的代碼段的依賴 -drools-6(kie)從kie工作臺部署的工件模塊和會話自動掃描(從春天)

@Service 
public class TniServiceImpl implements TniService { 

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

在我的根context.xml中,我已經參照XSD一起加入紀伊命名空間爲好。我已經添加了org.kie.spring.KModuleBeanFactoryPostProcessor以及每個drools文檔。我正在嘗試爲KSession掃描和注入(它已經在使用@Inject的同一項目中爲我的其他組件工作)進行CDI注入工作。到目前爲止,我總是得到「找不到符合條件的[org.kie.api.runtime.KieSession]類型的合格bean」錯誤。看起來春天無法掃描可用的kie模塊和其中的會話。需要下面的幫助 -

  1. CDI注入是否真的支持彈簧?我是否必須明確配置kmodules和kession as mentioned here
  2. 我在這裏錯過了什麼應該讓這個掃描和注射工作?

我的環境是以下 -

  1. 彈簧3.2.6-RELEASE(包括webmvc和其它部件)
  2. kie-api-6.0.1.FINAL
  3. 紀伊 - 彈簧 - 6.0 .1.FINAL
  4. kie-internal-6.0.1.FINAL

我已經通過以下鏈接但沒有了呂克K(主要是他們沒有試圖做我是什麼) -

  1. Loading Drools/KIE Workbench artifacts directly from the repository
  2. why does loading Drools 6 KIE JAR into code fail?

,我會很感激,如果任何人都可以指導我可能是什麼缺少的部分在這裏或如果除了在spring配置文件中明確定義所有kmodules/ksessions,別無選擇。

回答

4

我有同樣的問題,在這裏找到了一個解決方案:http://drools.46999.n3.nabble.com/Spring-4-0-amp-Drools-6-0-1-Integration-issue-td4028052.html

基本上你將需要注入的ApplicationContext代替kieSession和手動獲取XML豆。

TniServiceImpl.java

@Service 
public class TniServiceImpl implements TniService { 

    @Inject 
    ApplicationContext context; 

    KieSession kieSession; 

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

根的context.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" /> 

希望這有助於。

UPDATE:

另一種方式實現這一目標是保持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(); 
      ... 
    } 
} 
+0

我在處理這件事時遇到了兩個挑戰。首先,自動掃描來自彈簧和第二次注射的僞影。這個解決方案雖然有效,但是也不行。我自己也使用類似的解決方案。根據http://docs.jboss.org/jbpm/v6.0.1/userguide/jBPMReleaseNotes.html#d0e16995,這應該與@Inject一起工作(至少在我的上下文中使用了kie:module,kie:base和kie:session )但它沒有。在我看來,JBPM與Spring的集成並不完整,儘管他們表示他們已經對它進行了改進。 – Avnish

+0

@Avnish我同意你的觀點,看起來像JBPM與spring的集成並不完整。不是最優雅的解決方案,但在此之前,我甚至無法運行該項目,getKieClasspathContainer()始終返回null。在你的問題中,我不清楚沒有自動掃描/注入的情況下工作正常。 – Perazzo

+0

@Avnish我提出瞭解決方案,看看。 – Perazzo

0

以上答案不適用於spring mvc。我發現這是現有流水帳中的一個錯誤,他們正在修復它的下一個版本。由於我在批處理模式下使用DROOLS,但我希望將它用於託管在Websphere上的REST服務中,所以我停留在這一點上。 上述解決方案在批處理程序中完美工作。

0

這就是我與最新的Spring MVC(春季啓動)

@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(); 

希望這可以幫助那些仍然有問題的人

相關問題