2014-01-23 3 views
8

Ich versuche, eine Bahn (Feder-mvc) Anwendung mit kie (drools 6) zu bauen über Injektion integriert. Ich habe die kie-Workbench verwendet, um einen Workflow zu erstellen, der eingehalten und implementiert wurde. Ich habe mein Projekt Referenz dieses Artefakt hinzugefügt in pom.xml und hinzugefügt, um die lokale kie-Workbench-Repository per this blog post und es funktioniert gut (Ziehen in dem Artefakt als Abhängigkeit in meinem Maven/Feder-Projekt).drools-6 (kie) die automatische Scannen (ab Frühjahr) von Modulen und Sitzungen von kie Werkbank eingesetzt Artefakte

@Service 
public class TniServiceImpl implements TniService { 

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

In meiner root-context.xml, ich habe den kie Namespace als auch zusammen mit Bezug auf xsd hinzugefügt - Was ich versuche zu tun ist, um die kiesession in einen meines Dienst als Abhängigkeit mit folgendem Ausschnitt zu injizieren. Ich habe org.kie.spring.KModuleBeanFactoryPostProcessor sowie per Drools Dokumentation hinzugefügt. Ich versuche CDI Verpressarbeiten für KSession Scannen und Injektion (es arbeitet bereits für meine andere Komponenten in demselben Projekt, mit @Inject) zu machen. Bisher habe ich immer bin immer „Keine qualifizierenden Bohne vom Typ [org.kie.api.runtime.KieSession] für Abhängigkeit gefunden“ -Fehler. Sieht so aus, als ob der Frühling nicht in der Lage ist, die verfügbaren kie Module und Sitzungen darin zu scannen. Brauchen Sie Hilfe beim Folgen -

  1. Ist CDI injizieren wirklich unterstützt mit Feder? Muss ich zu kmodules und kession konfigurieren explizit as mentioned here?
  2. Fehle ich etwas hier, die diese Scannen und Injektionsarbeiten machen sollte?

Meine Umgebung ist folgende -

  1. Frühjahr 3.2.6-RELEASE (einschließlich webmvc und anderen Komponenten)
  2. kie-api-6.0.1.FINAL
  3. kie-Feder-6.0 .1.FINAL
  4. kie-internal-6.0.1.FINAL

ich habe bereits durch folgende Links, aber keine luc gegangen k (meist versuchen, sie nicht zu tun, was ich bin) -

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

Ich werde es begrüßen, wenn jemand auf mich führen kann, was das fehlende Stück hier sein könnte, oder wenn Es gibt keine andere Möglichkeit, als alle Konfigurationsdateien von kmodules/ksessions explizit zu definieren.

Antwort

4

hatte ich das gleiche Problem und eine Lösung hier: http://drools.46999.n3.nabble.com/Spring-4-0-amp-Drools-6-0-1-Integration-issue-td4028052.html

Grundsätzlich müssen Sie Application statt kieSession und bekommen xml Bohne manuell injizieren.

TniServiceImpl.java

@Service 
public class TniServiceImpl implements TniService { 

    @Inject 
    ApplicationContext context; 

    KieSession kieSession; 

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

Wurzel 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" /> 

Hoffnung, das hilft.

UPDATE:

Ein anderer Weg, dies zu erreichen xml identisch zu halten und stattdessen KieSession zu injizieren, zu versuchen, injiziert KieBase. Erstellen Sie dann mit der Instanz von KieBase neue 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

Es gab zwei Herausforderungen, die ich hatte, während ich daran arbeitete. Erstens, automatisches Scannen von Artefakten aus dem Frühjahr und der zweiten Injektion. Diese Lösung funktioniert zwar, funktioniert aber auch nicht. Ich selbst bin mit einer ähnlichen Lösung gelandet. Laut http://docs.jboss.org/jbpm/v6.0.1/userguide/jBPMReleaseNotes.html#d0e16995 sollte dies mit @Inject funktionieren (zumindest mit kie: modul, kie: base und kie: session in meinem Kontext)) aber es tut es nicht. Sieht für mich JBPM Integration mit Feder ist nicht vollständig, obwohl sie sagen, sie haben es neu gestaltet. – Avnish

+0

@Avnish ich stimme dir zu, sieht aus wie JBPM Integration mit Feder ist nicht abgeschlossen. Ist nicht die eleganteste Lösung, aber bevor ich das Projekt überhaupt nicht ausführen konnte, gab getKieClasspathContainer() immer null zurück. In deiner Frage war mir nicht klar, dass das ohne Auto-Scan/Injection gut ging. – Perazzo

+0

@Avnish Ich habe die Lösung überarbeitet, schau sie dir an. – Perazzo

0

Die obige Antwort funktioniert nicht mit Federmvc. Ich habe festgestellt, dass dies ein Fehler in den vorhandenen Drools ist und sie beheben es in der nächsten Version. Ich stehe an diesem Punkt fest, da ich DROOLS im Batch-Modus verwende, aber ich möchte, dass es in einem REST-Service verwendet wird, der auf der Websphere gehostet wird. Die obige Lösung funktioniert perfekt in einem Stapelprogramm.

0

Dies ist, was ich mit dem neuesten Spring MVC (Frühling-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"); 
} 
} 

und unten ist die kmodule.xml

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

schließlich alles, was Sie in Ihrem Controller zu tun ist

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

hoffe das hilft diesen Leuten immer noch Probleme

Verwandte Themen