9.4. サービスノードの実行

プロセスエンジンには、WorkItemHandlers に作業アイテムを委譲して実行させる WorkItemManager が含まれています。WorkItemHandlers は、作業アイテムの処理が完了すると WorkItemManager に通知します。「通知 (Notification)」の作業アイテムを実行するには、NotificationWorkItemHandler を作成する必要があります (WorkItemHandler インターフェースの実装)。
package com.sample;

import org.drools.runtime.process.WorkItem;
import org.drools.runtime.process.WorkItemHandler;
import org.drools.runtime.process.WorkItemManager;

public class NotificationWorkItemHandler implements WorkItemHandler {

  public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
    // extract parameters
    String from = (String) workItem.getParameter("From");
    String to = (String) workItem.getParameter("To");
    String message = (String) workItem.getParameter("Message");
    String priority = (String) workItem.getParameter("Priority");
    // send email
    EmailService service = ServiceRegistry.getInstance().getEmailService();
    service.sendEmail(from, to, "Notification", message);
    // notify manager that work item has been completed
    manager.completeWorkItem(workItem.getId(), null);
  }

  public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
    // Do nothing, notifications cannot be aborted
  }

}
この WorkItemHandler は、E-メールとして通知を送信直後に、WorkItemManager に作業アイテムの処理完了を通知します。すべての作業アイテムの処理が直接完了できるわけではない点にご注意ください。作業アイテムの実行に時間がかかる場合、非同期的に実行が継続され WorkItemManager への通知は後ほど送信されます。作業アイテムが完了前に中断してしまった場合、abort メソッドを使用してアイテムの中断方法を指定する必要があります。
WorkItemHandlers は、以下の API を使用して WorkItemManager に登録する必要があります。
ksession.getWorkItemManager().registerWorkItemHandler(
    "Notification", new NotificationWorkItemHandler());
作業アイテムの実行をプロセス自体から切り離すことで、次のような利点があります。
  1. プロセスがより宣言形式になり、方法でななく何を実行するのかを指定します。
  2. 環境の変更は、作業アイテムハンドラーを変更することで実装することができます。プロセス自体は変更しないようにしてください。
  3. 作業アイテムハンドラーが対象のサービスとの統合を行なっている場合、別の環境でも同じプロセスを利用することができます。
  4. 作業アイテムハンドラーは、プロセスやプロジェクトの境界を超えて、簡単に共有できます (プロセス自体にコードが埋め込まれている場合はより困難になります)。
  5. コンテキストにあわせて、様々な作業アイテムハンドラーを使用することができます。例えば、テストやシミュレーションには、作業アイテムを実行する必要がない場合もあります。このような場合、テスト時にはダミーの特別作業アイテムハンドラーを使用します。