|
JMS (Java Message Service) は、メッセージング システムと通信するための Java API です。一般に、メッセージング システムは、メッセージ指向ミドルウェア (MOM) と呼ばれる製品としてパッケージ化されています。Oracle WebLogic Server には Oracle WebLogic JMS によるメッセージング機能が組み込まれていますが、サード パーティの MOM を使用することもできます。メッセージング システムは、レガシー システムと通信するために、または別の環境やホストで実行されているビジネス コンポーネント間で通信を行うために、エンタープライズ アプリケーションでよく使用されます。
WLI JMS コントロールを使用すると、Oracle Workshop for WebLogic ビジネス プロセスは JMS 実装を提供するメッセージング システムと簡単に対話できます。特定の WLI JMS コントロールは、メッセージング システムの特定の機能に関連付けられています。定義された WLI JMS コントロールは、他の Oracle Workshop for WebLogic コントロールと同様にビジネス プロセスで使用できます。
WLI JMS コントロールは、RawData メッセージ タイプのサポート、動的プロパティのコンフィグレーション、および新しいトランザクションを開始するか呼び出し側のトランザクションに留まるかを制御する機能などの追加機能を提供します。JMS イベント ジェネレータを使って、WLI JMS コントロールによって生成されたメッセージをポーリングおよび処理できます。
コントロール インスタンスをビジネス プロセスに追加する方法については、「ビジネス プロセスでコントロールを使用する」を参照してください。
このトピックでは、JMS (Java Message Service)、したがって WLI JMS コントロールを使用してアクセス可能なメッセージング システムの特徴について説明します。
WLI JMS コントロールの詳細については、「WLI JMS コントロール」を参照してください。
WLI JMS コントロールでサポートされる具体的なメッセージングのシナリオについては、「WLI JMS コントロールでサポートされるメッセージングのシナリオ」を参照してください。
メッセージング システムを使用すると、ソフトウェア コンポーネント間で通信することができます。メッセージング システムのクライアントは、他の任意のクライアントとメッセージを送受信することができます。各クライアントは、メッセージの送受信機能を提供するメッセージング サーバに接続します。Oracle WebLogic Server のコンポーネントである Oracle WebLogic JMS は、メッセージング サーバの一例です。Oracle WebLogic Server では、サード パーティのメッセージング システムもサポートしています。
メッセージング システムを使用すると、非同期の分散通信を行うことができます。コンポーネントはメッセージを送り先に対して送信します。メッセージの受信側は送り先からメッセージを取得できます。送信側と受信側は直接通信しません。送信側にはメッセージの送信先となる送り先があることしかわからず、受信側にもメッセージの受信元となる送り先があることしかわかりません。送信側と受信側でメッセージ フォーマットの種類と送り先について一致しているかぎり、メッセージング システムが実際のメッセージ配信を管理します。
メッセージング システムを使用すると信頼性も実現されます。信頼性のレベルは送り先またはクライアントごとにコンフィグレーションするのが一般的ですが、メッセージング システムでは、メッセージが配信されることと、予定されている宛先に 1 回だけ配信されることが保証されます。
JMS は、ポイント ツー ポイントとパブリッシュ/サブスクライブという 2 種類のメッセージベースの通信をサポートしています。
ポイント ツー ポイント メッセージングには JMS キューを使用します。キューとは、JMS サーバでコンフィグレーションされている特定の名前付きリソースです。
WLI JMS コントロールなどの JMS クライアントは、キューとの間でメッセージを送受信します。ポイント ツー ポイント メッセージのコンシューマは 1 つだけです。複数のレシーバが同じキューのメッセージをリスンできますが、いずれかのレシーバが特定のメッセージをキューから取り出すと、メッセージは消費され、他のコンシューマが取り出すことはできなくなります。
メッセージが受信されるたびに、メッセージ コンシューマに受信確認が通知されます。
メッセージング システムは、あらかじめ指定されている試行回数に達するまで、個々のメッセージの再送信を続けます。
パブリッシュ/サブスクライブ メッセージングには JMS トピックを使用します。トピックとは、JMS サーバでコンフィグレーションされている特定の名前付きリソースです。
WLI JMS コントロールなどの JMS クライアントは、トピックにメッセージをパブリッシュしたり、サブスクライブしたりします。パブリッシュされたメッセージのサブスクライバは複数でもかまいません。トピックに対するすべてのサブスクライバは、サブスクリプションがアクティブになったら、そのトピックに対してパブリッシュされているすべてのメッセージを受け取ることができます。
JMS クライアントは、メッセージング システムとの接続を取得してからでないと、キューまたはトピックとの間でメッセージを送受信できません。これには接続ファクトリを使用します。接続ファクトリは、メッセージ サーバ管理者がコンフィグレーションするリソースです。接続ファクトリの名前は、接続を取得しようとするクライアントがルックアップできるように、JNDI ディレクトリに保存されます。
Oracle Workshop for WebLogic には、cgConnectionFactory
というデフォルトの接続ファクトリがあらかじめコンフィグレーションされています。この接続ファクトリは、明示的にオーバーライドしないかぎり、すべての WLI JMS コントロールで使用されます。デフォルト以外の接続ファクトリを使用する場合は、そのファクトリは以下のように設定されている必要があります。
userTransactionsEnabled="true"
JMS メッセージのコンポーネントは、標準のヘッダ フィールドのセット、アプリケーション固有のプロパティのセット、およびメッセージ本体です。各 JMS メッセージには、デフォルトで含まれており、メッセージ コンシューマが使用可能な標準のヘッダ フィールドのセットが含まれています。フィールドのいくつかはメッセージ プロデューサが設定できます。メッセージのプロパティ フィールドには、送信側アプリケーションによって追加されるヘッダ フィールドが含まれます。プロパティは、標準の Java の名前と値のペアです。メッセージ本体には、プロデューサからコンシューマに配信されるコンテンツが含まれます。以下のアノテーションを使用して、これらのコンポーネントのコンテンツを操作できます。
このトピックでは、WLI JMS コントロールでサポートされる具体的なメッセージングのシナリオについて説明します。
JMS (Java Message Service) の詳細については、「概要 : メッセージング システムと JMS」を参照してください。
WLI JMS コントロールの詳細については、「WLI JMS コントロール」を参照してください。
JMS 仕様は、さまざまなメッセージング シナリオをサポートしています。シナリオの中には、Web サービスの性質のため、スタンドアロン アプリケーションでは可能でも Oracle Workshop for WebLogic 環境では可能ではないものがあります。
以下の節で取り上げるメッセージングのシナリオは、WLI JMS コントロールでサポートされます。WLI JMS コントロールでサポートされないメッセージングのシナリオについては、「WLI JMS コントロールでサポートされないメッセージングのシナリオ」を参照してください。
ビジネス プロセスは、WLI JMS コントロールを使用して、メッセージを JMS キューに送信できます。ビジネス プロセスは応答を受け取りません。キューが存在し、JNDI レジストリに登録されていることが必要です。対象の JMS キューをコンフィグレーションする管理者は、配信保証ポリシーを決定します。
@com.bea.control.JMSControl.JMS
アノテーションの send-jndi-name
属性の値として対象の JMS キューの名前を指定します。また、sendtype
属性に queue
を指定します。WLI JMS コントロールの作成方法については、「WLI JMS コントロールを作成する」を参照してください。
ビジネス プロセスは、WLI JMS コントロールを使用して、メッセージを JMS の 1 つのキューに送信し、別のキューの応答メッセージを受信することができます。1 つの WLI JMS コントロールがコンフィグレーション済みのキューとの間で送信と受信の両方を行えるので、ビジネス プロセスは同じコントロールを使用して送信と受信を行えます。
注意 : | 双方向のメッセージングには、受信した各メッセージと、元のメッセージを送信したビジネス プロセスのインスタンスを対応させる必要があります。WLI JMS コントロールでは、送信側の会話 ID が送信メッセージの send_correlation_property で送信されます。メッセージの相関の詳細については、JMSControl.JMS アノテーションの send-correlation-property および receive-correlation-property 属性の説明を参照してください。 |
@com.bea.control.JMSControl.JMS
アノテーションの send-jndi-name
属性の値として、メッセージの送信先の JMS キューの名前を指定します。また、send-type
属性に queue
を指定します。 @com.bea.control.JMSControl.JMS
アノテーションの receive-jndi-name
属性の値として、メッセージの受信元の JMS キューの名前を指定します。また、receivetype
属性に queue
を指定します。receiveTextMessage
、receiveBytesMessage
、receiveObjectMessage
、または receiveRawMessage
) 用のコールバック ハンドラ、または WLI JMS コントロールに定義したカスタム コールバックを実装します。
ビジネス プロセスは、WLI JMS コントロールを使用して、メッセージを JMS トピックにパブリッシュできます。ビジネス プロセスは応答を受け取りません。トピックが存在し、JNDI レジストリに登録されていることが必要です。
@com.bea.control.JMSControl.JMS
アノテーションの send-jndi-name
属性の値として対象の JMS トピックの名前を指定します。また、sendtype
属性に topic
を指定します。 sendTextMessage
、sendBytesMessage
、sendObjectMessage
、または sendRawMessage
) を呼び出すか、WLI JMS コントロール用に定義したカスタム メソッドを呼び出します。
ビジネス プロセスは、WLI JMS コントロールを使用して、メッセージを JMS トピックにサブスクライブできます。トピックが存在し、JNDI レジストリに登録されていることが必要です。ビジネス プロセスがトピックにサブスクライブした後に送信されたメッセージのみを受信できます。
@com.bea.control.JMSControl.JMS
アノテーションの receivejndiname
属性の値として対象の JMS トピックの名前を指定します。また、receivetype
属性に topic
を指定します。receiveTextMessage
、receiveBytesMessage
、receiveObjectMessage
、または receiveRawMessage
) 用のコールバック ハンドラ、または WLI JMS コントロールに定義したカスタム コールバックを実装します。
このトピックでは、WLI JMS コントロールでサポートされない具体的なメッセージングのシナリオについて説明します。
WLI JMS コントロールの詳細については、「WLI JMS コントロール」を参照してください。
JMS 仕様は、さまざまなメッセージング シナリオをサポートしています。シナリオの中には、Web サービスの性質のため、スタンドアロン アプリケーションでは可能でも Oracle Workshop for WebLogic 環境では可能ではないものがあります。
以下の節で取り上げるメッセージングのシナリオは、WLI JMS コントロールでサポートされません。WLI JMS コントロールでサポートされるメッセージングのシナリオについては、「WLI JMS コントロールでサポートされるメッセージングのシナリオ」を参照してください。
ビジネス プロセスは、WLI JMS コントロールを使用して、受信キューを指定したり、そのキューから非請求メッセージを受信したりすることができません。
ビジネス プロセスは、特定のクライアントに代わって、非同期で特定の会話に関与しつつ処理を実行しなければなりません。非請求メッセージをキューから受信すると、WLI JMS コントロールが、非請求受信メッセージと相関する適切な会話またはクライアントを判別できません。
注意 : | JMS イベント ジェネレータおよびメッセージ ブローカの機能を使って、ビジネス プロセスで非請求メッセージを受信できます。メッセージ ブローカ コントロールおよび JMS イベント ジェネレータの使用方法については、「メッセージ ブローカ コントロール」を参照してください。 |
ここでは、新しい WLI JMS コントロールを作成する方法について説明します。
WLI JMS コントロールの詳細については、「WLI JMS コントロール」を参照してください。
新しい WLI JMS コントロールを作成してビジネス プロセスに追加できます。新しい WLI JMS コントロールを定義するには、以下の手順に従います。
注意 : | [データ パレット] ビューが Oracle Workshop for WebLogic に表示されない場合は、メニュー バーから [ウィンドウ|ビューの表示|データ パレット] をクリックします。 |
[コントロールの挿入 : WLI JMS] ダイアログ ボックスが表示されます (図 16-1 を参照)。
[コントロールの挿入 - JMS] ダイアログ ボックスが表示されます (図 16-2 を参照)。
ファイル コントロールで使用できるメソッドについては、WliJMSControl インタフェースを参照してください。
新しい WLI JMS コントロールを作成すると、プロジェクト内に新しい Java ファイルが作成されます。以下は Java ファイルの例です。
package requestquote;
@org.apache.beehive.controls.api.bean.ControlExtension
@com.bea.control.JMSControl.JMS(sendtype = com.bea.control.JMSControl.Type.queue, sendjndiname = "l", receivetype = com.bea.control.JMSControl.Type.queue, receivejndiname = "l", connectionfactoryjndiname = "o")
public interface WLIJMSCntrl extends com.bea.control.WliJMSControl {
/**
* 次のメソッドは javax.jms.TextMessage を sendJndiName に送信
*/
public void sendTextMessage(String payload);
/**
* コントロールで receiveJndiName を指定する場合、つまり、JWS がこのコントロールからメッセージを受信する場合は、
* コールバック ハンドラを実装する必要がある
*/
@org.apache.beehive.controls.api.events.EventSet(unicast = true)
interface Callback extends com.bea.control.WliJMSControl.Callback {
/**
* ここで、コールバック メソッドを 1 つだけ定義
*
* このメソッドは、receiveJndiName からのテキスト メッセージを処理できるコールバックを定義する
*/
public void receiveTextMessage(String payload);
}
static final long serialVersionUID = 1L;
public WLIJMSCntrl create();
}
この Java ファイルには、ダイアログで指定した名前の Java インタフェースの宣言が含まれています。このインタフェースは、コントロールの基本インタフェースを拡張します。Java インタフェースのコールバック以外のメソッドを呼び出すと、指定したキューまたはトピックに JMS メッセージが送信されます。
WLI JMS コントロールの Java ファイルの内容は、WLI JMS コントロールの挿入に使用したダイアログ ボックスで選択した設定によって異なります。上記の例は、[メッセージ タイプ] ドロップダウン リストで [テキスト/XMLBean] を選択した場合に生成されるものです。
WLI JMS コントロールのほとんどのプロパティは、デザイン ビューの [JPD コンフィグレーション] ペインからコンフィグレーションできます。これらのプロパティは、JMS コントロールの Java ファイルで @com.bea.control.JMSControl.JMS
アノテーションの属性としてエンコードされます。現在のパラメータ設定を取得するには、getControlProperties()
メソッドを使用します (これは基本の JMS コントロールの getProperties()
メソッドとは別のメソッドです。getProperties() メソッドは、最後に受信したメッセージの JMS プロパティを取得するために使用します)。
JMSControl:JMS
アノテーションとその属性の詳細については、「JMSControl:JMS アノテーション」を参照してください。
Oracle Workshop for WebLogic をインストールすると、WLI JMS コントロールのサンプルをサポートするための 2 つのキューがコンフィグレーションされます。キューの名前は、SimpleJmsQ
と CustomJmsCtlQ
です。これらのキューとの接続を提供する接続ファクトリは、weblogic.jws.jms.QueueConnectionFactory
JNDI 名を持ちます。操作を試すには、これらのリソースを使用します。
注意 : | サーバ上にデプロイされた各 WLI JMS コントロールは、ユニークなキューでリスンする必要があります。同じサーバ上の複数の WLI JMS コントロールが同じキューで同時にリスンすると、予期しない結果を招く可能性があります。詳細については、「WLI JMS コントロールに関する注意」を参照してください。 |
WLI JMS コントロールには、複数のメソッドと 1 つのコールバックを定義することができます。すべてのメソッドは、send-jndi-name
で名前を指定したキューまたはトピック (存在する場合) に送信またはパブリッシュします。
JMS では、送信またはパブリッシュ可能な複数のメッセージの種類を定義しています。WLI JMS コントロールで送信できる JMS メッセージの種類は、TextMessage
、ObjectMessage
、BytesMessage
、および JMSMessage
です。WLI JMS コントロールは、呼び出された WLI JMS コントロール メソッドのコンフィグレーションに基づいて送信するメッセージのタイプを動的に判別します。XML オブジェクトおよび XML 型付き変数は、text/XMLBean
メッセージ タイプを使用します。
注意 : | javax.jms.Message 引数を取る send メソッドまたは receive メソッドを使用して、任意のメッセージの種類を送信または受信できます (どのメッセージの種類も javax.jms.Message を拡張します)。たとえば、ObjectMessage を送信するには、myControl.getSession() を呼び出して JMS セッションを取得し、session.createObjectMessage() を呼び出してから、メッセージを送信します。 |
WLI JMS コントロール メソッドが単一の String 引数または XMLObject 引数を取る場合は、javax.jms.TextMessage
が送信されます。
WLI JMS コントロール メソッドが単一の java.lang.Object
タイプの引数を取る場合は、javax.jms.ObjectMessage
が送信されます。
WLI JMS コントロール メソッドが単一の javax.jms.BytesMessage
タイプの引数を取る場合は、javax.jms.BytesMessage
が送信されます。
WLI JMS コントロール メソッドが単一の javax.jms.Message
タイプの引数を取る場合は、JMS Message オブジェクトが直接送信されます。
メッセージ ヘッダとメッセージ プロパティを制御するパラメータを編集するには、デザイン ビューでコントロールを表示し、メソッドを選択してから、[JPD コンフィグレーション] ペインを使用してパラメータを編集します。パラメータは setProperties()
メソッドを使用してプログラムで設定できます。現在のパラメータ設定を表示するには、getControlProperties()
メソッドを使用します。
キーと値のペアを使用 (ペアごとに @com.bea.control.JMSControl.JMS
-property
アノテーションを使用) して、追加のプロパティを送信できます。ソース ビューでパラメータを直接編集することもできます。
send-jndi-name
、receive-jndi-name
、および connection-factory
に指定された JNDI 名は、リモートの JMS リソースを参照できます。JMS リソース名の指定形式は次のとおりです。
jms:{provider-host}/{factory-resource}/
{dest-resource}?{provider-parameters}
jms://host:7001/cg.jms.QueueConnectionFactory/
jws.MyQueue?URI=/drt/Bank.jws
jms://host:7001/MyProviderConnFactory/
MyQueue?SECURITY_PRINCIPAL=foo&SECURITY_CREDENTIALS=bar
WLI JMS コントロールを操作する場合には、次の点に注意してください。
receive-jndi-name
を参照する場合、Web サービスがすべての受信メッセージを別々のセットに区分できるように、receive-selector
属性を使用しなければならない。正しく区分しないと、特定の会話のメッセージがその会話に参加していないコントロール インスタンスに送信される可能性があります。JMS コントロールを使用する Web サービスの名前を変更して、元の名前のサービスをアンデプロイしないままにすると、元のサービスと新しいサービスでまったく同じコンフィグレーションの WLI JMS コントロールを使用している状態になり、この注意に違反することになります。receiveTextMessage
、receiveBytesMessage
、receiveObjectMessage
、receiveJMSMesage
、または開発者が定義したコールバック) しか定義できない。 getControlProperties()
メソッドと、最後に受信したメッセージの JMS プロパティを取得するために使用される、基本の JMS コントロールの getProperties()
メソッドとの違いに留意する。JMSControl.onMessage
メソッドから例外を送出する。これにより、現在のトランザクションはロールバックされます。その後の動作は、管理者が JMS の送り先をどのように設定したかによって異なります。再試行回数として小さな値と、エラーの送り先を設定しておくことをお勧めします。注意 : | 再試行回数として大きな値を設定し、エラーの送り先を設定していないコンフィグレーションの送り先の場合、WLI JMS コントロールのインフラストラクチャでは、メッセージ処理の試行と失敗を半永久的に繰り返すことになります。再配信制限の設定方法については、『WebLogic JMS プログラマーズ ガイド』を参照してください。 |