BEA ホーム | 製品 | デベロッパ・センタ | support | askBEA |
![]() |
![]() |
|
![]() |
e-docs > WebLogic Integration > BPM トピック > BPM クライアント アプリケーション プログラミング > JMS コネクタの確立 |
BPM クライアント アプリケーション プログラミング
|
JMS コネクタの確立
この章では、JMS (Java Message Service: Java メッセージ サービス) コネクタの確立方法について説明します。この章の内容は以下のとおりです。
注意: JMS の詳細については、次の URL の BEA WebLogic Server ドキュメント群に含まれている『WebLogic JMS プログラマーズ ガイド』を参照してください。
http://edocs.beasys.co.jp/e-docs/wls/docs70/jms/index.html
または、Sun Microsystems 社提供の次の URL の JavaSoft JMS specification version 1.0.2 を参照してください。
http://www.javasoft.com/products/jms/docs.html
JMS の概要
WebLogic Integration プロセス エンジンと Business Process Management (BPM) フレームワークが実行されている WebLogic Server によって JMS が実装され、JMS が XML コンテンツの伝送をサポートします。プロセス エンジンは WebLogic JMS を使用してワークリスト、時間、イベント通知、およびエラー/監査メッセージの通信を行います。
実行中の BPM ワークフロー インスタンスと外部クライアント アプリケーション間で、JMS が XML メッセージを使用して通信を可能にする方法を次の図に示します。
図6-1 JMS の概要
この図に示すように、JMS アプリケーションによって発行された XML イベントは以下のとおり処理されます。
プロセス エンジンによって使用される JMS 送り先についての説明と、送り先を接続して使用する方法を以下の節で紹介します。また、JMS トピック WLI_BPM_Notify に接続する方法を示したコード例についても説明します。
JMS の詳細については、次の URL の BEA WebLogic Server ドキュメント群に含まれている『WebLogic JMS プログラマーズ ガイド』を参照してください。
http://edocs.beasys.co.jp/e-docs/wls/docs70/jms/index.html
プロセス エンジンで使用される JMS 送り先
プロセス エンジンで使用される JMS 送り先(キューとトピック)を次の表に示します。
JMS への接続
プロセス エンジンで使用される JMS 送り先の表に定義されているいずれかの JMS 送り先に接続するには(および、XML メッセージをポスティングして受信できるようにするには)、WebLogic Server 管理者が各送り先に対して以下の手順を実行する必要があります。
JMS の詳細については、次の URL の BEA WebLogic Server ドキュメント群に含まれている『WebLogic JMS プログラマーズ ガイド』を参照してください。
http://edocs.beasys.co.jp/e-docs/wls/docs70/jms/index.html
メッセージの非同期受信
メッセージを送り先から非同期に受信するには、以下の手順を実行して非同期メッセージ リスナを登録する必要があります。
public void setMessageListener(
javax.jms.MessageListener listener
) throws javax.jms.JMSException
JMS の詳細については、次の URL から BEA WebLogic Server ドキュメント内の『WebLogic JMS プログラマーズ ガイド』を参照してください。
http://edocs.beasys.co.jp/e-docs/wls/docs70/jms/index.html
複数のイベント キューに対するメッセージ駆動型 Bean の生成
前述のとおり、システム管理者は、必要に応じて複数のイベント キューを定義できます(JMS への接続参照)。この場合、システム管理者は関連付けられているメッセージ駆動型 Bean も生成する必要があります。
複数のイベント キューに対するメッセージ駆動型 Bean を生成するには、com.bea.wlpi.util.MDBGenerator ユーティリティを次のように使用します。
java com.bea.wlpi.util.MDBGenerator -queue queue_name
[-min number] [-max number] [-order number] [-transact]
[-validate] [-timeout seconds] [-help]
MDBGenerator ユーティリティの引数を次の表に示します。
このユーティリティにより、特定のキューに対してメッセージ駆動型 Bean デプロイメントが jar ファイル qname-mdb.jar (qname は関連付けられているキュー名) として生成されます。 WebLogic Server にメッセージ駆動型 Bean をデプロイするには、ファイル ejb-jar.xml と weblogic-ejb.xml を編集し、コンフィグレーション済みの JMS 送り先と EJB を関連付けます。詳細については、次の URL の BEA WebLogic Server ドキュメント群に含まれている『WebLogic Enterprise JavaBeans プログラマーズ ガイド』を参照してください。
メッセージ配信の保証
メッセージは、永続または非永続のいずれかとして指定できます。永続メッセージは必ず、少なくとも 1 回は配信されることが保証されています。このメッセージは、ファイルまたはデータベースに安全に書き込まれるまで、配信されたと見なされません。WebLogic JMS はコンフィグレーション中に、各 JMS サーバに割り当てられた永続バックアップ ストア(ファイルまたは JDBC データベース)に永続メッセージを書き込みます。非永続メッセージは保存されません。非永続メッセージは、システムに障害が無い限り、必ず 1 回は配信されます。ただし、障害の場合、メッセージは失われます。コネクタが閉じ、また回復すると、通知が済んでいない非永続メッセージはすべて、再配信されます。非永続メッセージはいったん通知されると、再配信されることはありません。
メッセージの配信時に 1 人または複数の受信者が対応しない場合は、アドレス指定メッセージを使用して確実にメッセージを配信できます。アドレス指定メッセージの場合、着信イベント メッセージはそのすべての受信者によって使用されるまで、または指定の期間(存続時間)が経過するまでのどちらか早い方まで保持されます。メッセージ配信はワークフロー インスタンスまたはテンプレートに基づいて保証できます。
アドレス指定メッセージを使用してメッセージ配信を保証するには、送信側アプリケーション(メッセージの作成者)が次の情報を定義する必要があります。
具体的には、これらのフィールドにより、メッセージを受信するインスタンスの ID やテンプレートの名前がそれぞれ指定されます。次の javax.jms.Message クラス メソッドを使用すると、JMS ヘッダ フィールド WLPIInstanceIDs と WLPITemplateNames を定義できます。
public void setStringProperty(
java.lang.String name,
java.lang.String value
) throws javax.jms.JMSException
たとえば、msg メッセージ インスタンスの JMS ヘッダ フィールドを定義するには次のメソッドを使用します。
String instanceID;
//instanceID set somewhere
msg.setStringProperty("WLPIInstanceIDs", instanceID);
String templateName="MyTemplate";
msg.setStringProperty("WLPITemplateNames", templateName);
これらのフィールドは文字列値として指定される必要があります。各フィールドには、複数の ID をカンマで区切って指定できます。インスタンスや、既にインスタンス化されているテンプレートのみを対象としてください。
JMS ヘッダ フィールドは常にメッセージと一緒に伝送され、メッセージ コンシューマが使用できます(メッセージ駆動型 Bean を含む)。JMS メッセージ ヘッダ フィールドの定義の詳細については、次の URL の BEA WebLogic Server ドキュメント群に含まれている『WebLogic JMS プログラマーズ ガイド』の「WebLogic JMS アプリケーションの開発」の「メッセージ ヘッダ フィールドおよびメッセージ プロパティ フィールドの設定と参照」を参照してください。
http://edocs.beasys.co.jp/e-docs/wls/docs70/jms/implement.html
http://edocs.beasys.co.jp/e-docs/wls/docs70/jms/implement.html
存続時間値は、『WebLogic Integration Studio ユーザーズ ガイド』の「アクションの定義」に説明されているとおり、[Studio XML イベントをポスト] ダイアログ ボックスでも設定できます。
設定された期限は、次の javax.jms.Message クラス メソッドを使用して JMSExpiration JMS ヘッダ フィールドで参照できます。
public long getJMSExpiration(
) throws javax.jms.JMSException
JMS メッセージ ヘッダ フィールドの参照の詳細については、次の URL から BEA WebLogic Server ドキュメント内群の『WebLogic JMS プログラマーズ ガイド』の「WebLogic JMS アプリケーションの開発」の「メッセージ ヘッダ フィールドおよびメッセージ プロパティ フィールドの設定と参照」を参照してください。
http://edocs.beasys.co.jp/e-docs/wls/docs70/jms/implement.html
アドレス指定メッセージ送信を使用してメッセージ配信を保証する方法を次の図に示します。
図6-2 メッセージ配信の保証
メッセージの順次処理の保証
メッセージ駆動型 Bean の利点の 1 つは、ランダムなメッセージ駆動型 Bean インスタンスによって着信メッセージを並列処理できることです。ただし、この場合、メッセージが処理される順序は保証されません。
メッセージが受信されて処理される順序が重要である場合は、すべてのメッセージを同じメッセージ駆動型 Bean インスタンスに送信することでその順序を保証できます。
メッセージが同じメッセージ駆動型 Bean インスタンスに配信されて順次処理されるためには、送信側アプリケーションと受信側アプリケーションで以下の手順を実行する必要があります。
次の javax.jms.Message クラス メソッドを使用すると、JMS ヘッダ フィールド WLPIOrderKey を定義できます。
public void setLongProperty(
java.lang.String name,
long value
) throws javax.jms.JMSException
たとえば、msg メッセージ インスタンスの WLPIOrderKey JMS ヘッダ フィールドを定義するには次のメソッドを使用します。
msg.setLongProperty("WLPIOrderKey",
Long.parseLong(instanceID));
順次処理を必要とする関連メッセージには、同じ順序キー値が割り当てられる必要があります。
JMS ヘッダ フィールドは常にメッセージと一緒に伝送され、メッセージ コンシューマが使用できます(メッセージ駆動型 Bean を含む)。JMS メッセージ ヘッダ フィールドの定義の詳細については、次の URL の BEA WebLogic Server ドキュメント群に含まれている『WebLogic JMS プログラマーズ ガイド』の「WebLogic JMS アプリケーションの開発」の「メッセージ ヘッダ フィールドおよびメッセージ プロパティ フィールドの設定と参照」を参照してください。
http://edocs.beasys.co.jp/e-docs/wls/docs70/jms/implement.html
注意: 順次処理されるすべてのメッセージ グループは、同じ JMS イベント キューに送信される必要があります。
特定の順序キーを持つすべてのメッセージは、同じメッセージ駆動型 Bean インスタンスにより、受信された順序で処理されるため、メッセージの順次処理が保証されます。
順序キーを使用したメッセージの順次処理を次の図に示します。
図6-3 メッセージの順次処理の保証
JMS トピックへの接続例
この節には、JMS 送り先(この節には Worklist 通知トピックである WLPI_BPM_Notify)への接続方法を示すコード例が記載されています。WLPI_BPM_Notify トピックは、表示を更新するために Worklist クライアントにより動的に(つまり、メッセージの受信時に)使用されます。このサンプルでは、通知の受信にメッセージ セレクタ(フィルタ)が使用されています。続いて、受信されたメッセージのプロパティがオーガニゼーション、ロール、ユーザ、およびアクションの現在値に一致する場合は、表示の更新にメッセージ セレクタが使用されます。
コードの各セクションについて以下で詳しく説明します。JMS の詳細については、次の URL から BEA WebLogic Server ドキュメント内の『WebLogic JMS プログラマーズ ガイド』を参照してください。
http://edocs.beasys.co.jp/e-docs/wls/docs70/jms/index.html
JNDI コンテキスト、JMS コネクタ ファクトリ、およびトピック静的変数を含む必須の変数を定義します。
protected static final String JNDI_FACTORY= "weblogic.jndi.WLInitialContextFactory";
protected static final String JMS_FACTORY= "javax.jms.TopicConnectionFactory";
protected static final String NOTIFY_TOPIC="com.bea.wli.bpm.Notify";
メッセージを JMS トピックに送信するのに必要なすべてのオブジェクトを作成します。
private TopicConnectionFactory tconFactory;
private TopicConnection tcon;
private TopicSession tsession;
private Topic topic;
private TopicSubscriber tsubscriber;
JNDI 初期コンテキストを次のとおり設定します。
try {
Hashtable env = new Hashtable();
env.put(Context.PROVIDER_URL, wlpi.getUrl());
env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
env.put("weblogic.jndi.createIntermediateContexts", "true");
Context ctx = new InitialContext(env);
tconFactory = (TopicConnectionFactory) ctx.lookup(JMS_FACTORY);
tcon = tconFactory.createTopicConnection();
topic = (Topic)ctx.lookup(NOTIFY_TOPIC);
if (tsubscriber != null) tsubscriber.close();
String selector = "orgId = '" +
wlpi.getWorklist().getActiveOrganization() + "' AND assigneeId = '" +
wlpi.getUserId() + "' AND NOT role" + " AND action = 'assigned'";
tsubscriber = tsession.createSubscriber(topic, selector, false);
tsubscriber.setMessageListener(this);
tcon.start();
}
メッセージは、トピック セッションに配信された後で、onMessage() メソッドに渡されます。このメソッドは、メッセージの非同期受信に記載の手順に従って実装する必要があります。
次のコードは、通知を使用してタスクリスト表示を更新するメッセージ リスナ クライアントの例です。
注意: AWT/Swing アプリケーションの場合は、onMessage() メソッド呼び出しへの呼び出しと同じスレッド上のユーザ インタフェースは更新しないでください。更新すると、デッドロックや例外が発生します。呼び出しは AWT Event Dispatcher Thread にマーシャリングしてください。Swing ユーティリティには、実行可能オブジェクトを AWT Event Dispatcher Thread にエンキューする invokeLater() メソッドが用意されていて、更新ロジックを実行可能オブジェクト run() メソッドにインクルードできます。
import javax.swing.SwingUtilities;
public void onMessage(Message msg) {
String action;
TaskInfo task;
try {
// TaskInfo ペイロードを持つ ObjectMessages
// が該当。
if (!(msg instanceof ObjectMessage))
return;
Object data = ((ObjectMessage)msg).getObject();
if (!(data instanceof TaskInfo))
return;
action = msg.getStringProperty("action");
task = (TaskInfo)data;
} catch (JMSException e) {
e.printStackTrace();
return;
}
if (action.equals("update"))
taskUpdated(task);
else if (action.equals("remove"))
taskDeleted(task);
}
private void taskDeleted(final TaskInfo task) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
vTasks.remove(task);
int row = vDisplayedTasks.indexOf(task);
if (row != -1) {
vDisplayedTasks.remove(row);
model.fireTableRowsDeleted(row, row);
}
}
});
}
JMS の詳細については、次の URL から BEA WebLogic Server ドキュメント内の『WebLogic JMS プログラマーズ ガイド』を参照してください。
http://edocs.beasys.co.jp/e-docs/wls/docs70/jms/index.html
![]() |
![]() |
![]() |
![]() |
||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |