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する度に新しいセッションが作られて、ルールが実行されるようになる。