第5章 Java EE アプリケーションサーバー機能

本章を読んで、JPBM を使った Java EE インフラストラクチャーの活用方法について理解できるようにしましょう。

5.1. エンタープライズ Bean

CommandServiceBeanは、別の JBPM コンテキスト内でexecute メソッドを呼び出すことによって JBoss Business Process Manager を実行するステートレスセッション Bean です。
以下の表に、利用できるカスタマイズ可能なリソースと環境エントリについて要約されています。

表5.1 コマンドサービス Bean 環境

名前 種類 説明
JbpmCfgResource 環境エントリ JBPM 設定を読み取るクラスパスリソース。オプションで、デフォルトは jbpm.cfg.xml です。
ejb/TimerEntityBean EJB 参照 スケジューラサービスを実装するローカルエンティティ Bean へのリンク。 タイマーを含むプロセスに必要です。 
jdbc/JbpmDataSource リソースマネージャ参照 JDBC 接続を JBPM 永続サービスに提供するデータソースの論理名です。Hibernate 設定ファイルの hibernate.connection.datasource プロパティに一致する必要があります。
jms/JbpmConnectionFactory リソースマネージャ参照 JMS 接続を JBPM メッセージサービスに提供するファクトリの論理名です。非同期続行を含むプロセスに必要です。
jms/JobQueue メッセージ送信先参照 JBPM メッセージサービスはこのキューにジョブメッセージを送信します。ジョブリスナー Bean がメッセージを受信するキューと同じキューになるように、message-destination-link が一般的な論理送信先 JobQueue を示します。
jms/CommandQueue メッセージ送信先参照 コマンドリスナー Bean はこのキューからメッセージを受信します。 コマンドメッセージを送信するキューと同じキューになるように、 message-destination-link element は一般的な論理送信先 CommandQueue を参照します。
CommandListenerBean はコマンドメッセージを CommandQueue でリッスンするメッセージ駆動型 Bean です。この Bean はコマンド実行を CommandServiceBean に委譲します。
メッセージ本体は org.jbpm.Command インタフェースを実装できる Java オブジェクトである必要があります (メッセージプロパティがある場合は無視されます)。メッセージが必要とされる書式でない場合、メッセージは DeadLetterQueue へ転送され、それ以降の処理は行われません。送信先参照が存在しない場合、メッセージは拒否されます。
受信されたメッセージがreplyTo 返信先を指定している場合、 コマンド実行の結果は object message にラッピングされ、 その返信先に送信されます。
command connection factory environment reference は、 Java メッセージサービス接続を提供するために使用されるリソースマネージャを示します。
反対に、JobListenerBean は、 asynchronous continuations をサポートするために JbpmJobQueue でジョブメッセージをリッスンするメッセージ駆動型 Bean です。

注記

メッセージには、 タイプ longjobId と呼ばれるプロパティがなければなりません。 このプロパティは、 データベースで待機中の Job への参照が含まれていなければなりません。 メッセージ本体が存在する場合は無視されます。
この Bean は CommandListenerBean を拡張し、 後の環境エントリとカスタム化に利用可能なリソース参照を継承します。

表5.2 コマンド/ジョブリスナー Bean 環境

名前 種類 説明
ejb/LocalCommandServiceBean EJB 参照 別の JBPM コンテキストでコマンドを実行するローカルセッション Bean へのリンクです。
jms/JbpmConnectionFactory リソースマネージャ参照 結果メッセージを生成するために Java メッセージサービスの接続を提供するファクトリの論理名です。 返信先を指定するコマンドメッセージに必要です。
jms/DeadLetterQueue メッセージ送信先参照 コマンドを含まないメッセージは、 ここで参照されるキューに送信されます。 省略可能であり、 使用しない場合はこのようなメッセージは拒否され、 コンテナが再配信することがあります。
TimerEntityBean は、 スケジューリングのため Enterprise Java Bean タイマサービスによって使用されます。 有効期限が切れると、 タイマーの実行は command service Bean に委譲されます。
TimerEntityBean は、 ビジネスプロセスマネージャのデータソースにアクセスする必要があります。 Enterprise Java Bean デプロイメント記述子は、 エンティティ Bean をデータベースにマップする方法を定義しません (コンテナプロバイダによって定義されます)。 JBoss Application Server では、 jbosscmp-jdbc.xml 記述子がデータソースの JNDI 名とリレーショナルマッピングデータ (テーブルや列名など) を定義します。

注記

JBoss CMP (container-managed persistence) 記述子は、 リソースマネージャ参照 (java:comp/env/jdbc/JbpmDataSource) ではなくグローバル JNDI 名 (java:JbpmDS) を使用します。

注記

ビジネスプロセスマネージャの以前のバージョンは、 Enterprise Java Bean タイマーサービスと対話するために TimerServiceBean という名前のステートレスセッション Bean を使用しました。 このセッション方式は、 cancellation メソッドに回避できないボトルネックが発生する原因となっていたため廃止しなければなりませんでした。 セッション Bean に ID がないため、 タイマーサービスはすべてのタイマーを反復してキャンセルするタイマを見つけなければなりませんでした。
後方互換性を維持する目的でこの Bean は今でも使用可能です。TimerEntityBean と同じ環境で動作するため、移行も簡単です。

表5.3 タイマーエンティティ / サービス Bean 環境

名前 種類 説明
ejb/LocalCommandServiceBean EJB 参照 別の JBPM コンテキストでタイマーを実行するローカルのセッション Bean へのリンクです。