42.4. JMS メッセージプロパティーの操作
概要
Apache CXF JMS トランスポートには、JMS メッセージのプロパティーを検査するために使用できるコンテキストメカニズムがあります。コンテキストメカニズムを使用して、JMS メッセージのプロパティーを設定することもできます。
42.4.1. JMS メッセージヘッダーの検査
概要
コンシューマーとサービスは、異なるコンテキストメカニズムを使用して JMS メッセージヘッダーのプロパティーにアクセスします。ただし、両方のメカニズムはヘッダープロパティーを org.apache.cxf.transports.jms.context.JMSMessageHeadersType
オブジェクトとして返します。
サービスでの JMS メッセージヘッダーの取得
WebServiceContext
オブジェクトから JMS メッセージヘッダーのプロパティーを取得するには、以下を行います。
- 「コンテキストの取得」 で説明されているようにコンテキストを取得します。
-
org.apache.cxf.transports.jms.JMSConstants.JMS_SERVER_HEADERS パラメーターと共にメッセージコンテキストの
get()
メソッドを使用して、メッセージコンテキストからメッセージヘッダーを取得します。
例42.12「サービス実装での JMS メッセージヘッダーの取得」 は、サービスのメッセージコンテキストから JMS メッセージヘッダーを取得するためのコードを示しています。
例42.12 サービス実装での JMS メッセージヘッダーの取得
import org.apache.cxf.transport.jms.JMSConstants; import org.apache.cxf.transports.jms.context.JMSMessageHeadersType; @WebService(serviceName = "HelloWorldService", portName = "HelloWorldPort", endpointInterface = "org.apache.cxf.hello_world_jms.HelloWorldPortType", targetNamespace = "http://cxf.apache.org/hello_world_jms") public class GreeterImplTwoWayJMS implements HelloWorldPortType { @Resource protected WebServiceContext wsContext; ... @WebMethod public String greetMe(String me) { MessageContext mc = wsContext.getMessageContext(); JMSMessageHeadersType headers = (JMSMessageHeadersType) mc.get(JMSConstants.JMS_SERVER_HEADERS); ... } ... }
コンシューマーでの JMS メッセージヘッダープロパティーの取得
メッセージが JMS トランスポートから正常に取得されると、コンシューマーの応答コンテキストを使用して JMS ヘッダーのプロパティーを検査できます。さらに、「クライアント受信タイムアウト」 で説明されているように、クライアントがタイムアウトする前に応答を待機する時間の長さを設定または確認できます。 コンシューマーの応答コンテキストから JMS メッセージヘッダーを取得するには、次の手順を実行します。
- 「コンテキストの取得」 で説明されているように応答コンテキストを取得します。
-
org.apache.cxf.transports.jms.JMSConstants.JMS_CLIENT_RESPONSE_HEADERS をパラメーターとしてコンテキストの
get()
メソッドを使用して、応答コンテキストから JMS メッセージヘッダーのプロパティーを取得します。
例42.13「コンシューマー応答ヘッダーからの JMS ヘッダーの取得」 は、コンシューマーの応答コンテキストから JMS メッセージヘッダープロパティーを取得するためのコードを示しています。
例42.13 コンシューマー応答ヘッダーからの JMS ヘッダーの取得
import org.apache.cxf.transports.jms.context.*; // Proxy greeter initialized previously BindingProvider bp = (BindingProvider)greeter; Map<String, Object> responseContext = bp.getResponseContext(); JMSMessageHeadersType responseHdr = (JMSMessageHeadersType) responseContext.get(JMSConstants.JMS_CLIENT_RESPONSE_HEADERS); ... }
例42.13「コンシューマー応答ヘッダーからの JMS ヘッダーの取得」 のコードは、以下を行います。
プロキシーを BindingProvider にキャストします。
応答コンテキストを取得します。
応答コンテキストから JMS メッセージヘッダーを取得します。
42.4.2. メッセージヘッダーのプロパティーの検査
標準 JMS ヘッダープロパティー
表42.3「JMS ヘッダーのプロパティー」 検査できる JMS ヘッダーの標準プロパティーをリスト表示します。
プロパティー名 | プロパティータイプ | ゲッターメソッド |
---|---|---|
相関 ID |
|
|
配信モード |
|
|
メッセージの有効期限 |
|
|
メッセージ ID |
|
|
Priority |
|
|
再配信 |
|
|
タイムスタンプ |
|
|
型 |
|
|
有効期間 |
|
|
オプションのヘッダープロパティー
さらに、JMSMessageHeadersType.getProperty()
を使用して、JMS ヘッダーに保存されているすべてのオプションプロパティーを検証することもできます。オプションのプロパティーは、org.apache.cxf.transports.jms.context.JMSPropertyType
の List
として返されます。オプションのプロパティーは、名前と値のペアとして保存されます。
例
例42.14「JMS ヘッダープロパティーの読み取り」 は、応答コンテキストを使用して一部の JMS プロパティーを検査するためのコードを示しています。
例42.14 JMS ヘッダープロパティーの読み取り
// JMSMessageHeadersType messageHdr retrieved previously System.out.println("Correlation ID: "+messageHdr.getJMSCorrelationID()); System.out.println("Message Priority: "+messageHdr.getJMSPriority()); System.out.println("Redelivered: "+messageHdr.getRedelivered()); JMSPropertyType prop = null; List<JMSPropertyType> optProps = messageHdr.getProperty(); Iterator<JMSPropertyType> iter = optProps.iterator(); while (iter.hasNext()) { prop = iter.next(); System.out.println("Property name: "+prop.getName()); System.out.println("Property value: "+prop.getValue()); }
例42.14「JMS ヘッダープロパティーの読み取り」 のコードは、以下を行います。
メッセージの相関 ID の値を出力します。
メッセージの priority プロパティーの値を出力します。
メッセージの再配信されたプロパティーの値を出力します。
メッセージのオプションのヘッダープロパティーのリストを取得します。
プロパティーのリストをトラバースするために Iterator
を取得する。
オプションのプロパティーのリストを繰り返し、それらの名前と値を出力します。
42.4.3. JMS プロパティーの設定
概要
コンシューマーエンドポイントでリクエストコンテキストを使用すると、JMS メッセージヘッダープロパティーの数とコンシューマーエンドポイントのタイムアウト値を設定できます。これらのプロパティーは、1 回の呼び出しで有効です。サービスプロキシーで操作を呼び出すたびに、それらをリセットする必要があります。
サービスにヘッダープロパティーを設定することはできないことに注意してください。
JMS ヘッダーのプロパティー
表42.4「設定可能な JMS ヘッダープロパティー」 は、コンシューマーエンドポイントのリクエストコンテキストを使用して設定できる JMS ヘッダーのプロパティーをリスト表示します。
プロパティー名 | プロパティータイプ | セッターメソッド |
---|---|---|
相関 ID |
|
|
配信モード |
|
|
Priority |
|
|
有効期間 |
|
|
-
org.apache.cxf.transports.jms.context.JMSMessageHeadersType
オブジェクトを作成します。 - 表42.4「設定可能な JMS ヘッダープロパティー」 で説明されている適切なセッターメソッドを使用して、設定する値を入力します。
-
org.apache.cxf.transports.jms.JMSConstants.JMS_CLIENT_REQUEST_HEADERS を第 1 引数として、新しい
JMSMessageHeadersType
オブジェクトを第 2 引数として使用してリクエストコンテキストのput()
メソッドを呼び出すことで、値をリクエストコンテキストに設定します。
オプションの JMS ヘッダープロパティー
オプションのプロパティーを JMS ヘッダーに設定することもできます。オプションの JMS ヘッダープロパティーは、他の JMS ヘッダープロパティーを設定するために使用される JMSMessageHeadersType
オブジェクトに保存されます。それらは、org.apache.cxf.transports.jms.context.JMSPropertyType
オブジェクトが含まれる List
オブジェクトとして保存されます。オプションのプロパティーを JMS ヘッダーに追加するには、次の手順を実行します。
-
JMSPropertyType
オブジェクトを作成します。 -
setName()
を使用して、プロパティーの name フィールドを設定します。 -
setValue()
を使用して、プロパティーの value フィールドを設定します。 -
JMSMessageHeadersType.getProperty().add(JMSPropertyType)
を使用して、JMS メッセージヘッダーにプロパティーを追加します。 - すべてのプロパティーがメッセージヘッダーに追加されるまで、この手順を繰り返します。
クライアント受信タイムアウト
JMS ヘッダーのプロパティーに加えて、コンシューマーエンドポイントがタイムアウトする前に応答を待機する時間を設定できます。org.apache.cxf.transports.jms.JMSConstants.JMS_CLIENT_RECEIVE_TIMEOUT を第 1 引数として、コンシューマーが待機するミリ秒単位の時間を表す long
を第 2 引数としてリクエストコンテキストの put()
メソッドを呼び出すことで、値を設定します。
例
例42.15「リクエストコンテキストを使用した JMS プロパティーの設定」 は、リクエストコンテキストを使用していくつかの JMS プロパティーを設定するためのコードを示しています。
例42.15 リクエストコンテキストを使用した JMS プロパティーの設定
import org.apache.cxf.transports.jms.context.*; // Proxy greeter initialized previously InvocationHandler handler = Proxy.getInvocationHandler(greeter); BindingProvider bp= null; if (handler instanceof BindingProvider) { bp = (BindingProvider)handler; Map<String, Object> requestContext = bp.getRequestContext(); JMSMessageHeadersType requestHdr = new JMSMessageHeadersType(); requestHdr.setJMSCorrelationID("WithBob"); requestHdr.setJMSExpiration(3600000L); JMSPropertyType prop = new JMSPropertyType; prop.setName("MyProperty"); prop.setValue("Bluebird"); requestHdr.getProperty().add(prop); requestContext.put(JMSConstants.CLIENT_REQUEST_HEADERS, requestHdr); requestContext.put(JMSConstants.CLIENT_RECEIVE_TIMEOUT, new Long(1000)); }
例42.15「リクエストコンテキストを使用した JMS プロパティーの設定」 のコードは、以下を行います。
JMS プロパティーを変更するプロキシーの InvocationHandler
を取得する。
InvocationHandler
が BindingProvider
であるかどうかを確認する。
返された InvocationHandler
オブジェクトを BindingProvider
オブジェクトにキャストし、リクエストコンテキストを取得する。
リクエストコンテキストを取得します。
JMSMessageHeadersType
オブジェクトを作成し、新しいメッセージヘッダーの値を保持する。
相関 ID を設定します。
エクスパレーションプロパティーを 60 分に設定します。
新しい JMSPropertyType
オブジェクトを作成する。
オプションのプロパティーの値を設定します。
オプションのプロパティーをメッセージヘッダーに追加します。
JMS メッセージヘッダー値をリクエストコンテキストに設定します。
クライアントの受信タイムアウトプロパティーを 1 秒に設定します。