第5章 Java EE アプリケーションサーバーの機能
この章でが、jBPM が提供する、Java EE インフラストラクチャーを活用するために使用できる機能を説明します。
5.1. エンタープライズ Bean リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
CommandServiceBean
は ステートレスセッション Bean であり、別の jBPM コンテキスト内の execute
メソッドを呼び出すことにより、Business Process Manager コマンドを実行します。使用可能な環境エントリーとカスタマイズ可能なリソースを次の表にまとめます。
名前 | タイプ | 説明 |
---|---|---|
JbpmCfgResource | 環境エントリー | これは、jBPM 設定の読み取り元となるクラスパスリソースです。オプションであり、デフォルトは jbpm.cfg.xml です。 |
ejb/TimerEntityBean | EJB 参照 | これは、スケジューラーサービスを実装するローカルエンティティー Bean へのリンクです。タイマーを含むプロセスに必要です。 |
jdbc/JbpmDataSource | リソースマネージャー参照 | これは、jBPM 永続性サービスへの JDBC 接続を提供するデータソースの論理名です。Hibernate 設定ファイルの hibernate.connection.datasource プロパティーと一致する必要があります。 |
jms/JbpmConnectionFactory | リソースマネージャー参照 | これは、JMS 接続を jBPM メッセージサービスに提供するファクトリーの論理名です。非同期継続を含むプロセスに必要です。 |
jms/JobQueue | メッセージ宛先参照 | jBPM メッセージサービスは、ジョブメッセージをこのキューに送信します。ジョブリスナー Bean のメッセージ受信元のキューとこのキューが必ず同じになるように、message-destination-link は共通の論理宛先である JobQueue を参照します。 |
jms/CommandQueue | メッセージ宛先参照 | コマンドリスナー Bean は、このキューからメッセージを受信します。コマンドメッセージ送信先のキューとこのキューが必ず同じになるように、message-destination-link 要素は共通の論理宛先である CommandQueue を参照します。 |
CommandListenerBean
は、コマンドメッセージの CommandQueue
をリッスンするメッセージ駆動型 Bean です。この Bean は、コマンドの実行を CommandServiceBean
に委譲します。
メッセージの本文は、
org.jbpm.Command
インターフェイスを実装できる Java オブジェクトでなければなりません。(メッセージプロパティーがある場合は無視されます。) メッセージが想定される形式でない場合、メッセージは DeadLetterQueue
に転送され、それ以上処理されません。宛先参照が存在しない場合も、メッセージは拒否されます。
受信したメッセージで宛先
replyTo
が指定されている場合、コマンド実行結果が オブジェクトメッセージ
にラップされて送信されます。
コマンド接続ファクトリー環境参照
は、Java Message Service 接続を提供するために使用されるリソースマネージャーを参照します。
逆に、
JobListenerBean
は、非同期継続 をサポートするために、ジョブメッセージの JbpmJobQueue
をリッスンするメッセージ駆動型 Bean です。
注記
メッセージには、
long
型の jobId というプロパティーが必要であることに注意してください。このプロパティには、データベース内にある保留中の Job への参照が含まれている必要があります。メッセージ本文が存在する場合、それは無視されます。
この Bean は
CommandListenerBean
を拡張します。後者の環境エントリーとカスタマイズ可能なそのリソース参照を継承します。
名前 | タイプ | 説明 |
---|---|---|
ejb/LocalCommandServiceBean | EJB 参照 | これは、別の jBPM コンテキストでコマンドを実行するローカルセッション Bean へのリンクです。 |
jms/JbpmConnectionFactory | リソースマネージャー参照 | これは、結果メッセージを生成するための Java Message Service 接続を提供するファクトリーの論理名です。返信先を示すコマンドメッセージに必要です。 |
jms/DeadLetterQueue | メッセージ宛先参照 | コマンドを含まないメッセージは、ここで参照されているキューに送信されます。これはオプションです。これがない場合、そのようなメッセージは拒否され、コンテナーが再配信されることがあります。 |
- | ||
メッセージ宛先参照 | コマンドを含まないメッセージは、ここで参照されているキューに送信されます。これがない場合、そのようなメッセージは拒否され、コンテナーが再配信されることがあります。 |
TimerEntityBean
は、Enterprise Java Bean タイマーサービス でスケジューリングに使用されます。Bean の有効期限が切れると、タイマーの実行が command service
Bean に委譲されます。
TimerEntityBean
は、Business Process Manager のデータソースへのアクセスを必要とします。Enterprise Java Bean デプロイメント記述子は、エンティティー Bean をデータベースにマップする方法を定義しません。(これはコンテナー提供者に任されています。) JBoss Application Server では、jbosscmp-jdbc.xml 記述子が、データソースの JNDI 名とリレーショナルマッピングデータ (テーブル名や列名など) を定義します。
注記
JBoss CMP (コンテナー管理永続性) 記述子は、リソースマネージャー参照 (
java:comp/env/jdbc/JbpmDataSource
) とは異なり、グローバル JNDI 名 (java:JbpmDS
) を使用します。
注記
以前のバージョンの Business Process Manager は、
TimerServiceBean
というステートレスセッション Bean を使用して、Enterprise Java Bean タイマーサービスと対話していました。セッション方式は、cancelation
メソッドのボトルネックが避けられなかったため、断念せざるを得ませんでした。セッション Bean には ID がないため、タイマーサービスは すべて のタイマーをイテレートして、キャンセルする必要のあるタイマーを見つける必要がありました。
この Bean は、下位互換性を確保する目的で引き続き使用できます。
TimerEntityBean
と同じ環境で動作するため、移行が容易です。
名前 | タイプ | 説明 |
---|---|---|
ejb/LocalCommandServiceBean | EJB 参照 | これは、別の jBPM コンテキストでタイマーを実行するローカルセッション Bean へのリンクです。 |
5.2. jBPM エンタープライズ設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
次の設定項目が
jbpm.cfg.xml
に含まれています。
JtaDbPersistenceServiceFactory
により、Business Process Manager は JTA トランザクションに参加できます。既存のトランザクションが進行中の場合、JTA 永続性サービスはそれを "保持" します。そうでない場合は、新しいトランザクションを開始します。Business Process Manager のエンタープライズ Bean は、トランザクション管理をコンテナーに委譲するように設定されています。ただし、トランザクションがアクティブでない環境 (Web アプリケーションなど) で JbpmContext を作成すると、新しいトランザクションが自動的に開始されます。 JTA 永続性サービスファクトリー
には、以下で説明する設定可能なフィールドが含まれています。
- isCurrentSessionEnabled
- これを
true
に設定すると、Business Process Manager は、進行中の JTA トランザクションに関連付けられた "現在" の Hibernate セッションを使用します。これはデフォルト設定です。詳細は、http://www.hibernate.org/hib_docs/v3/reference/en/html/architecture.html#architecture-current-session を参照してください。コンテキストセッションメカニズムを利用して、アプリケーションの他の部分で jBPM と同じセッションを使用します。これは、SessionFactory.getCurrentSession()
の呼び出しを通じて行われます。または、isCurrentSessionEnabled をfalse
に設定し、JbpmContext.setSession(session)
メソッドを介してセッションを注入することで、jBPM に Hibernate セッションを提供します。これにより、jBPM がアプリケーションの他の部分と同じ Hibernate セッションを使用することも保証されます。注記Hibernate セッションは (永続性コンテキストなどを介して) ステートレスセッション Bean に注入できます。 - isTransactionEnabled
true
に設定すると、jBPM は Hibernate のtransaction API
を介してトランザクションを開始し、JbpmConfiguration.createJbpmContext()
メソッドを使用してトランザクションをコミットします。(JbpmContext.close()
が呼び出されると、Hibernate セッションは閉じられます。)警告これは、Business Process Manager が EAR としてデプロイされている場合に望ましい動作ではないため、isTransactionEnabled はデフォルトではfalse
に設定されています。(詳細は、http://www.hibernate.org/hib_docs/v3/reference/en/html/transactions.html#transactions-demarcation を参照してください。)
JmsMessageServiceFactory は、
Java Message Service インターフェイスを通じて公開される信頼性の高い通信インフラストラクチャーを利用して、非同期継続メッセージ
を JobListenerBean
に配信します。JmsMessageServiceFactory
は、次の設定可能なフィールドを公開します。
- connectionFactoryJndiName
- これは、JNDI 初期コンテキストでの JMS 接続ファクトリーの名前です。デフォルトは
java:comp/env/jms/JbpmConnectionFactory
です。 - destinationJndiName
- これは、ジョブメッセージ送信先の JMS 宛先の名前です。これは、
JobListenerBean
がメッセージを受信する宛先と一致する必要があります。デフォルトはjava:comp/env/jms/JobQueue
です。 - isCommitEnabled
- これは、Business Process Manager が
JbpmContext.close()
で Java Message Service セッションをコミットする必要があるかどうかを指定します。JMS メッセージサービスによって生成されたメッセージは、現在のトランザクションがコミットされる前に受信されることを意図したものではありません。そのため、このサービスによって作成されたセッションは、常にトランザクション処理されます。デフォルト値はfalse
です。これは、使用中の接続ファクトリー
が XA 対応である場合に適しています。Java Message Service セッションによって生成されるメッセージは、JTA トランザクション全体によって制御されるためです。JMS 接続ファクトリーが XA 対応でない場合は、Business Process Manager が JMS セッションのローカルトランザクションを明示的にコミットするように、このフィールドをtrue
に設定する必要があります。
EntitySchedulerServiceFactory
は、ビジネスプロセスタイマーをスケジュールするために使用されます。これは、Enterprise Java Bean コンテナーによって提供される時間指定イベントのトランザクション通知サービスに基づいて構築することによって行われます。EJB スケジューラーサービスファクトリー
には、以下で説明する設定可能なフィールドがあります。
- timerEntityHomeJndiName
- これは、JNDI 初期コンテキストでの
TimerEntityBean
のローカルホームインターフェイスの名前です。デフォルト値はjava:comp/env/ejb/TimerEntityBean
です。
5.3. Hibernate エンタープライズ設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
hibernate.cfg.xml
ファイルには、次の設定項目が含まれています。他のデータベースまたはアプリケーションサーバーをサポートするには、これらを変更します。
hibernate.dialect
設定は、お使いのデータベース管理システムに適した設定に置き換えます。(詳細は、http://www.hibernate.org/hib_docs/v3/reference/en/html/session-configuration.html#configuration-optional-dialects を参照してください。)
HashtableCacheProvider
は、サポートされている他のキャッシュプロバイダーに置き換えることができます。(詳細は、http://www.hibernate.org/hib_docs/v3/reference/en/html/performance.html#performance-cache を参照してください。)
初期状態で、jBPM は
JTATransactionFactory
を使用するように設定されています。既存のトランザクションが進行中の場合、JTA トランザクションファクトリーはそれを使用します。それ以外の場合は、新しいトランザクションが作成されます。jBPM のエンタープライズ Bean は、トランザクション管理をコンテナーに委譲するように設定されています。ただし、アクティブなトランザクションがないコンテキスト (Web アプリケーションなど) で jBPM API が使用されている場合、トランザクションが自動的に開始されます。
コンテナー管理トランザクション を使用するときに意図しないトランザクションが作成されるのを防ぐには、
CMTTransactionFactory
に切り替えます。この設定により、Hibernate が常に既存のトランザクションを探し、見つからない場合は問題を報告するようになります。
5.4. クライアントコンポーネント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
エンタープライズサービスを活用できる Business Process Manager API に対して直接記述されたクライアントコンポーネントのデプロイメント記述子に対して、適切な環境参照が設定されていることを確認してください。以下の記述子は、クライアントセッション Bean の典型的なものと見なすことができます。
上記の環境参照は、次のようにターゲット運用環境のリソースにバインドできます。JNDI 名は、Business Process Manager エンタープライズ Bean で使用される値と一致することに注意してください。
クライアントコンポーネントがエンタープライズ Bean ではなく Web アプリケーションである場合、デプロイメント記述子は次のようになります。
上記の環境参照は、次のコードサンプルのとおり、ターゲット運用環境のリソースにバインドすることもできます。
5.5. まとめ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
この章では、Java EE インフラストラクチャーを活用するために使用できる jBPM によって提供される機能を詳しく説明しました。本章の説明をもとに、お客様の企業環境でこれらをテストすることをお勧めします。