第14章 Seam と JBoss Rules
Seam では、Seam コンポーネントまたは jBPM プロセス定義から JBoss Rules (Drools) の ルールベースの呼び出しが容易になります。
14.1. ルールをインストールする リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
最初のステップは、 Seam コンテキスト変数で
org.drools.RuleBase のインスタンスを使用可能にすることです。 テスト目的で、 Seam はクラスパスから静的なルール一式をコンパイルする組み込みコンポーネントを提供しています。 このコンポーネントは components.xml を使ってインストールできます。
<drools:rule-base name="policyPricingRules">
<drools:rule-files>
<value>policyPricingRules.drl</value>
</drools:rule-files>
</drools:rule-base>
このコンポーネントは、 DRL (
.drl) 一式、 またはデシジョンテーブル (.xls) ファイルからルールをコンパイルし、 Seam APPLICATION コンテキストに org.drools.RuleBase のインスタンスをキャッシュします。 ルール駆動型アプリケーションには複数のルールベースのインストールが必要となる可能性が高いので留意してください。
Drools DSL を使用したい場合は DSL 定義も指定する必要があります。
<drools:rule-base name="policyPricingRules" dsl-file="policyPricing.dsl">
<drools:rule-files>
<value>policyPricingRules.drl</value>
</drools:rule-files>
</drools:rule-base>
RuleBaseConfiguration でカスタムの結果例外ハンドラを登録する場合はそのハンドラを記述する必要があります。 次のサンプルで示します。
@Scope(ScopeType.APPLICATION)
@Startup
@Name("myConsequenceExceptionHandler")
public class MyConsequenceExceptionHandler
implements ConsequenceExceptionHandler, Externalizable {
public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException { }
public void writeExternal(ObjectOutput out) throws IOException { }
public void handleException(Activation activation,
WorkingMemory workingMemory,
Exception exception) {
throw new ConsequenceException( exception, activation.getRule() );
}
}
次にこれを登録します。
<drools:rule-base name="policyPricingRules"
dsl-file="policyPricing.dsl"
consequence-exception-handler=
"#{myConsequenceExceptionHandler}">
<drools:rule-files>
<value>policyPricingRules.drl</value>
</drools:rule-files>
</drools:rule-base>
ほとんどのルール駆動型アプリケーションでは、 ルールは動的にデプロイ可能でなければなりません。 RuleBase の管理に Drools RuleAgent を使用すると便利です。 RuleAgent は Drools ルールサーバー (BRMS) またはローカルファイルレポジトリにあるホットデプロイルールのパッケージに接続することができます。 RulesAgent 管理の RuleBase も
components.xml で設定が可能です。
<drools:rule-agent name="insuranceRules"
configurationFile="/WEB-INF/deployedrules.properties" />
プロパティファイルにはその RulesAgent に固有のプロパティが含まれます。 Drools サンプルディストリビューションからの設定ファイルの例を示します。
newInstance=true
url=http://localhost:8080/drools-jbrms/org.drools.brms.JBRMS/package/
org.acme.insurance/fmeyer
localCacheDir=/Users/fernandomeyer/projects/jbossrules/drools-examples/
drools-examples-brms/cache
poll=30
name=insuranceconfig
また、 設定ファイルを避けコンポーネントで直接オプションを設定することも可能です。
<drools:rule-agent name="insuranceRules"
url="http://localhost:8080/drools-jbrms/org.drools.brms.JBRMS/
package/org.acme.insurance/fmeyer"
local-cache-dir="/Users/fernandomeyer/projects/jbossrules/
drools-examples/drools-examples-brms/cache"
poll="30"
configuration-name="insuranceconfig" />
次に、 各対話に対して
org.drools.WorkingMemory インスタンスを使用可能にする必要があります (各 WorkingMemory は現在の対話に関連する fact を蓄積します)。
<drools:managed-working-memory name="policyPricingWorkingMemory"
auto-create="true" rule-base="#{policyPricingRules}"/>
ruleBase 設定プロパティでルールベースに対して policyPricingWorkingMemory を参照している点に注目してください。
イベントリスナーを WorkingMemory に追加することで、ルール実行やアサートされるオブジェクトなど、ルールエンジンのイベントを通知する方法を追加することもできます。
<drools:managed-working-memory name="policyPricingWorkingMemory"
auto-create="true"
rule-base="#{policyPricingRules}">
<drools:event-listeners>
<value>org.drools.event.DebugWorkingMemoryEventListener</value>
<value>org.drools.event.DebugAgendaEventListener</value>
</drools:event-listeners>
</drools:managed-working-memory>