LoginSignup
1
1

More than 5 years have passed since last update.

Drools 6でKieSessionをCDIで取得する方法

Last updated at Posted at 2014-04-22

Droolsはバージョン6になって、APIにCDIが使えるものが出た。
今のところ、うれしいケースは少ない感触だけど、とりあえず使い方を。

依存性を解決

Gradleにしろ、Mavenにしろ、以下を追加。

  • javax.enterprise:cdi-api:1.2
  • org.jboss.weld.se:weld-se-core:2.2.0.Final

kmodule.xml

src/main/resources/META-INF/kmodule.xmlは、通常と変わらずに書いて、今回はStatelessセッションに。

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
    <kbase name="Base_Rules" packages="rules">
        <ksession name="example.session" type="stateless"/>
    </kbase>
</kmodule>

beans.xml

src/main/resources/META-INF/beans.xmlを内容なしで作っておく。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>

CDIするクラス

例えばこんなクラスでStatelessKieSessionをDIするように記述。
Java EEなプロジェクトじゃなかったので、CDIの実装にWeldを持ってきた。

import javax.inject.Inject;

import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;
import org.kie.api.cdi.KSession;
import org.kie.api.event.rule.DebugAgendaEventListener;
import org.kie.api.event.rule.DebugRuleRuntimeEventListener;
import org.kie.api.runtime.StatelessKieSession;

public class CDIRunner {
    @Inject
    @KSession("example.session")
    private StatelessKieSession session;

    public <T> void run(List<T> objs) {
        Weld weld = new Weld();
        WeldContainer container = weld.initialize();

        session = container.instance().select(StatelessKieSession.class).get();
        session.execute(objs);

        weld.shutdown();
    }
}

ルールを動かす

Groovyなのは、Spockでテストしたから。

def fact = new Fact("aaa")
def runner = new CDIRunner()

runner.run([fact])

こうすると、CDIRunnerをnewする度に新しいセッションが作られて、ルールが実行されるようになる。

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1