BEA ホーム | 製品 | デベロッパ・センタ | support | askBEA
 ドキュメントのダウンロード   サイト マップ   用語集 
検索

BPM クライアント アプリケーション プログラミング

 前 次 目次 索引 PDFで表示  

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 イベントは以下のとおり処理されます。

  1. 事前定義済みのイベント キュー(以下の節で説明する WLI_BPM_Event など)に配信されます。

  2. 適切なメッセージ駆動型 Bean に送信されて処理されます。

  3. 実行中のインスタンスに配信されます。

プロセス エンジンによって使用される 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 送り先(キューとトピック)を次の表に示します。

表6-1 プロセス エンジンで使用される JMS 送り先

JMS 送り先

JMS のタイプ

送られる項目

名前 : WLI_BPM_Audit

JNDI 名 : com.bea.wli.bpm.Audit

トピック

監査メッセージ。

名前 : WLI_BPM_Error

JNDI 名: com.bea.wli.bpm.Error

トピック

エラー メッセージ。

詳細については、ワークフロー例外のモニタリングを参照

名前 : WLI_BPM_Event

JNDI 名 : com.bea.wli.bpm.Event

キュー

イベント。

すべての入力メッセージはメッセージ駆動型 Bean により処理される。メッセージ駆動型 Bean とは、WebLogic JMS メッセージ システム内でメッセージ コンシューマとして機能する EJB のことである。標準 JMS メッセージ コンシューマと同様に、メッセージ駆動型 Bean はメッセージを JMS キューまたはトピックから受信し、メッセージのコンテンツに基づいてビジネス ロジックを実行する。さらに、メッセージ駆動型 Bean は JMS 送り先の並行処理もサポートする。

システム管理者は、必要に応じて複数のイベント キューを定義できる(JMS への接続参照)。この場合、システム管理者は複数のイベント キューに対するメッセージ駆動型 Bean の生成に記載のユーティリティを使用して、関連付けられているメッセージ駆動型 Bean も生成する必要があり、アプリケーション開発者は特定のイベントに対する適切な送り先を指定する必要がある。

メッセージ配信の保証メッセージの順次処理の保証に記載のメソッドを使用して、メッセージの配信と順次処理を適切に実行できる。

注意: 下位互換性を保つため、TopicRouter Bean は、WebLogic Process Integrator リリース 1.2.1 以前でサポートされている wlpiEvent トピックを宛先とするすべてのメッセージを WLI_BPM_Event キューに自動的に再ルーティングします。

名前 : WLI_BPM_Notify

JNDI 名 : com.bea.wli.bpm.Notify

トピック

Worklist 通知。

Worklist クライアントによる表示の動的な更新と、配信された com.bea.wlpi.common.TaskInfo オブジェクトを使用したタスク オブジェクト データの取得を可能にする。

WLI_BPM_Notify トピックにポスティングされたメッセージに対しては、適切なサブスクライバに確実に配信するために以下のメッセージ プロパティを定義する必要がある。

Worklist クライアントは、メッセージをそのプロパティに基づいてフィルタ処理するセレクタを定義できる。セレクタを使用してメッセージをフィルタ処理するコード例については、JMS トピックへの接続例を参照。

JMS の詳細については、次の URL から BEA WebLogic Server ドキュメント内の『WebLogic JMS プログラマーズ ガイド』を参照

http://edocs.beasys.co.jp/e-docs/wls/docs70/jms/index.html

名前 : WLI_BPM_Timer

JNDI 名 : com.bea.wli.bpm.Timer

キュー

タイム プロセッサ トリガ(内部使用のみ)

名前 : WLI_BPM_ValidatingEvent

JNDI 名 : com.bea.wli.bpm.ValidatingEvent

キュー

DTD または スキーマ検証を必要とするイベント

XML メッセージが DTD またはスキーマを参照する場合は、コンテンツを検証する必要があります。

名前 : WLI_FailedEvent

JNDI 名 : com.bea.wli.FailedEvent

キュー

正常に送信されなかったメッセージで、再試行回数の最大値に達したもの。

再試行回数の最大値は Redelivery-Limit 属性を使用して JMS 宛先ごとに設定されている。詳細については、次の URL の『BEA WebLogic Server コンフィグレーション リファレンス』にある JMS テンプレート要素の説明を参照

http://edocs.beasys.co.jp/e-docs/wls/docs70/config_xml/index.html

失敗したメッセージを受信した場合は、エントリがログ ファイルに記録されます。必要に応じて、カスタム イベント ハンドラを開発して失敗したメッセージを処理することもできます。


 

 


JMS への接続

プロセス エンジンで使用される JMS 送り先の表に定義されているいずれかの JMS 送り先に接続するには(および、XML メッセージをポスティングして受信できるようにするには)、WebLogic Server 管理者が各送り先に対して以下の手順を実行する必要があります。

  1. JNDI で JMS コネクタ ファクトリをルック アップします。

    システム管理者が任意の数のコネクタ ファクトリを定義してコンフィグレーションすると、起動中にそのファクトリが WebLogic Server によって JNDI スペースに追加されます。コネクタ ファクトリにより、コネクタ コンフィグレーション情報がカプセル化され、JMS アプリケーションが接続を作成できます。

  2. コネクタ ファクトリを使用してコネクタを作成します。

    コネクタとは、アプリケーションとメッセージ システム間のオープンな通信チャネルのことです。接続は、メッセージを生成して使用するセッションの作成に使われます。

  3. コネクタを使用してセッションを作成します。

    セッションにより、メッセージが生成および使用される順序が定義され、複数のメッセージ プロデューサとメッセージ コンシューマの作成が可能になります。

  4. JNDI で送り先をルック アップします。

    送り先はキューかトピックのどちらかになり、特定のプロバイダのアドレス構文をカプセル化します。管理者が送り先を定義してコンフィグレーションすると、起動中にその送り先が WebLogic Server によって JNDI スペースに追加されます。

    クライアント サイドでは、送り先はサーバ上のオブジェクトへのハンドルになります。メソッドにより、送り先名のみが返されます。メッセージ用の送り先にアクセスするには、送り先にアタッチ可能なメッセージ プロデューサとコンシューマを作成します。

  5. セッションと送り先を使用してメッセージ プロデューサとメッセージ コンシューマを作成します。

    メッセージ プロデューサはメッセージをキューまたはトピックに送信します。メッセージ コンシューマはメッセージをキューまたはトピックから受信します。

  6. 以下のいずれかの手順を実行します。

    1. メッセージ プロデューサを作成している場合は、メッセージ オブジェクトを作成します。

      メッセージにより、アプリケーション間で交換される情報がカプセル化されます。

    2. メッセージ コンシューマを作成している場合は、メッセージの非同期受信に説明されているとおり、非同期メッセージ リスナを登録すると便利な場合があります。

  7. コネクタを開始します。

JMS の詳細については、次の URL の BEA WebLogic Server ドキュメント群に含まれている『WebLogic JMS プログラマーズ ガイド』を参照してください。

http://edocs.beasys.co.jp/e-docs/wls/docs70/jms/index.html

 


メッセージの非同期受信

メッセージを送り先から非同期に受信するには、以下の手順を実行して非同期メッセージ リスナを登録する必要があります。

  1. javax.jms.MessageListener インタフェースを実装します(このインタフェースには onMessage() メソッドが含まれている)。

    注意: この手順は、WebLogic Server 6.0 以上ではメッセージ駆動型 Bean を使用して実行することも可能です。EJB の詳細については、次の URL の BEA WebLogic Server ドキュメント群に含まれている『WebLogic Enterprise JavaBeans プログラマーズ ガイド』を参照してください。

    http://edocs.beasys.co.jp/e-docs/wls/docs70/ejb/index.html

  2. 次の javax.jms.MessageConsumer メソッドを使用してリスナ情報を引数として渡してメッセージ リスナを設定します。
    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 ユーティリティの引数を次の表に示します。


 

表6-2 MDBGenerator ユーティリティの引数

引数

説明

-queue queue_name

メッセージ駆動型 Bean を生成するカスタム キュー名。

必須の引数。

-min minimum

順序なしメッセージの処理に割り当てられるメッセージ リスナの最低数。順序なしメッセージとは、特定の順序で処理される必要のないメッセージを指す(メッセージの順次処理の保証参照)。minimum によって最大値より小さい整数値を指定する必要がある。

この引数は省略可能で、デフォルトでは 0。

-max maximum

順序なしメッセージの処理に割り当てられるメッセージ リスナの最大数。maximum によって指定される整数値は 100 以下でかつ指定最小値より大きな整数値を指定する必要がある。

この引数は省略可能で、デフォルトでは 5。

-order ordernum

順序付きメッセージの処理に割り当てられるメッセージ リスナの数。順序付きメッセージとは、特定の順序で処理される必要のあるメッセージを指す(メッセージの順次処理の保証参照)。ordernum により 31 以下の素数が指定される。

この引数は省略可能で、デフォルトでは 0。

-transact

トランザクションが必須であることを示すフラグ。

-validate

キューで受信したすべてのメッセージを XML JMS メッセージ内の DOC-TYPE タグに照らして検証することを指定するフラグ。

省略可能な引数。

-timeout seconds

トランザクションのタイムアウト値(秒単位)。この引数のデフォルト値は 30 秒。

この値は、transact フラグが設定されていない場合にのみ使用する。transact フラグが設定されている場合は、WebLogic Server トランザクション タイムアウト値が採用される。この値の設定は Administration Console を使用して行うが、デフォルト値は 30 秒になっている。

-help

コマンド解説構文を表示することを指定するフラグ。

省略可能な引数。


 

このユーティリティにより、特定のキューに対してメッセージ駆動型 Bean デプロイメントが jar ファイル qname-mdb.jar (qname は関連付けられているキュー名) として生成されます。

WebLogic Server にメッセージ駆動型 Bean をデプロイするには、ファイル ejb-jar.xmlweblogic-ejb.xml を編集し、コンフィグレーション済みの JMS 送り先と EJB を関連付けます。詳細については、次の URL の BEA WebLogic Server ドキュメント群に含まれている『WebLogic Enterprise JavaBeans プログラマーズ ガイド』を参照してください。

http://edocs.beasys.co.jp/e-docs/wls/docs70/ejb/index.html

 


メッセージ配信の保証

メッセージは、永続または非永続のいずれかとして指定できます。永続メッセージは必ず、少なくとも 1 回は配信されることが保証されています。このメッセージは、ファイルまたはデータベースに安全に書き込まれるまで、配信されたと見なされません。WebLogic JMS はコンフィグレーション中に、各 JMS サーバに割り当てられた永続バックアップ ストア(ファイルまたは JDBC データベース)に永続メッセージを書き込みます。非永続メッセージは保存されません。非永続メッセージは、システムに障害が無い限り、必ず 1 回は配信されます。ただし、障害の場合、メッセージは失われます。コネクタが閉じ、また回復すると、通知が済んでいない非永続メッセージはすべて、再配信されます。非永続メッセージはいったん通知されると、再配信されることはありません。

メッセージの配信時に 1 人または複数の受信者が対応しない場合は、アドレス指定メッセージを使用して確実にメッセージを配信できます。アドレス指定メッセージの場合、着信イベント メッセージはそのすべての受信者によって使用されるまで、または指定の期間(存続時間)が経過するまでのどちらか早い方まで保持されます。メッセージ配信はワークフロー インスタンスまたはテンプレートに基づいて保証できます。

アドレス指定メッセージを使用してメッセージ配信を保証するには、送信側アプリケーション(メッセージの作成者)が次の情報を定義する必要があります。

  1. メッセージ ヘッダの一部である WLPIInstanceIDsWLPITemplateNames フィールド(ヘッダはメッセージ コンシューマのアドレスを定義する)。

    具体的には、これらのフィールドにより、メッセージを受信するインスタンスの ID やテンプレートの名前がそれぞれ指定されます。次の javax.jms.Message クラス メソッドを使用すると、JMS ヘッダ フィールド WLPIInstanceIDsWLPITemplateNames を定義できます。

    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

  2. アドレス指定メッセージを保持する秒数をメッセージ送信時に指定するパラメータとしての存続時間値。プロセス エンジンは、存続時間値が時間切れになるまで、またはメッセージが全アドレス指定受信者に使用されるまでのどちらか早い方までメッセージを保持します。このパラメータは整数値で指定する必要があります。メッセージ送信の詳細については、次の URL から BEA WebLogic Server ドキュメント内の『WebLogic JMS プログラマーズ ガイド』の「WebLogic JMS アプリケーションの開発」の「メッセージの送信」を参照してください。

    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 インスタンスに配信されて順次処理されるためには、送信側アプリケーションと受信側アプリケーションで以下の手順を実行する必要があります。

  1. メッセージを送信する前に、送信側メッセージ(メッセージ プロデューサ)は順序キー(WLPIOrderKey)を JMS メッセージ ヘッダ内のフィールドとして定義する必要があります。順序キーの値は、インスタンス ID などの長整数でなければなりません。

    次の 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

  2. 受信側アプリケーション(メッセージ コンシューマ)は、WLPIOrderKey 値に基づいて、処理が必要なメッセージをフィルタ処理する JMS メッセージ セレクタを定義する必要があります。

    メッセージ セレクタはブール式です。このセレクタは、SQL select 文の where 文節に似た構文を持つ文字列から構成されています。

    たとえば、WLPIOrderKey=1

    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);

  1. JNDI を使用してコネクタ ファクトリをルック アップします。
    tconFactory = (TopicConnectionFactory) ctx.lookup(JMS_FACTORY);

  1. コネクタ ファクトリを使用してコネクタを作成します。
    tcon = tconFactory.createTopicConnection();

  1. コネクタを使用してセッションを作成します。次のメソッドにより、セッションが未処理と定義され、メッセージが自動的に確認応答されるよう指定されます。

    セッション トランザクションと確認応答モードの詳細については、次の URL から BEA WebLogic Server ドキュメント内の『WebLogic JMS プログラマーズ ガイド』を参照してください。

    http://edocs.beasys.co.jp/e-docs/wls/docs70/jms/index.html

    tsession = tcon.createTopicSession(
    false, Session.AUTO_ACKNOWLEDGE
    );

  2. 送り先(トピック)を JNDI で次のとおりルック アップします。
    topic = (Topic)ctx.lookup(NOTIFY_TOPIC);

  1. セッションと送り先(トピック)を使用して、メッセージ プロデューサ(トピック発行者)への参照を作成します。サブスクライバが既に存在する場合は、閉じられます。オーガニゼーションと参加コンポーネントに関する情報がセレクタとして使用されます。セレクタの定義の詳細については、次の URL から BEA WebLogic Server ドキュメント内の『WebLogic JMS プログラマーズ ガイド』を参照してください。

    http://edocs.beasys.co.jp/e-docs/wls/docs70/jms/index.html

    wlpicom.bea.wlpi.client.common.WLPI クラスのインスタンスを次のコード例で表しています。

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);

  1. 非同期メッセージ リスナを登録します。
    tsubscriber.setMessageListener(this);

  1. コネクタを開始します。
    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

 

ページの先頭 前 次