42.4. JMS メッセージプロパティーの操作

概要

Apache CXF JMS トランスポートには、JMS メッセージのプロパティーを検査するために使用できるコンテキストメカニズムがあります。コンテキストメカニズムを使用して、JMS メッセージのプロパティーを設定することもできます。

42.4.1. JMS メッセージヘッダーの検査

概要

コンシューマーとサービスは、異なるコンテキストメカニズムを使用して JMS メッセージヘッダーのプロパティーにアクセスします。ただし、両方のメカニズムはヘッダープロパティーを org.apache.cxf.transports.jms.context.JMSMessageHeadersType オブジェクトとして返します。

サービスでの JMS メッセージヘッダーの取得

WebServiceContext オブジェクトから JMS メッセージヘッダーのプロパティーを取得するには、以下を行います。

  1. 「コンテキストの取得」 で説明されているようにコンテキストを取得します。
  2. 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 メッセージヘッダーを取得するには、次の手順を実行します。

  1. 「コンテキストの取得」 で説明されているように応答コンテキストを取得します。
  2. 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 ヘッダーの標準プロパティーを一覧表示します。

表42.3 JMS ヘッダーのプロパティー

プロパティー名プロパティータイプゲッターメソッド

相関 ID

string

getJMSCorralationID()

配信モード

int

getJMSDeliveryMode()

メッセージの有効期限

long

getJMSExpiration()

メッセージ ID

string

getJMSMessageID()

優先度

int

getJMSPriority()

再配信

boolean

getJMSRedlivered()

タイムスタンプ

long

getJMSTimeStamp()

string

getJMSType()

有効期間

long

getTimeToLive()

オプションのヘッダープロパティー

さらに、JMSMessageHeadersType.getProperty() を使用して、JMS ヘッダーに保存されているすべてのオプションプロパティーを検証することもできます。オプションのプロパティーは、org.apache.cxf.transports.jms.context.JMSPropertyTypeList として返されます。オプションのプロパティーは、名前と値のペアとして保存されます。

例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 ヘッダーのプロパティーを一覧表示します。

表42.4 設定可能な JMS ヘッダープロパティー

プロパティー名プロパティータイプセッターメソッド

相関 ID

string

setJMSCorralationID()

配信モード

int

setJMSDeliveryMode()

優先度

int

setJMSPriority()

有効期間

long

setTimeToLive()

これらのプロパティーを設定するには、次のようにします。

  1. org.apache.cxf.transports.jms.context.JMSMessageHeadersType オブジェクトを作成します。
  2. 表42.4「設定可能な JMS ヘッダープロパティー」 で説明されている適切なセッターメソッドを使用して、設定する値を入力します。
  3. 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 ヘッダーに追加するには、次の手順を実行します。

  1. JMSPropertyType オブジェクトを作成します。
  2. setName() を使用して、プロパティーの name フィールドを設定します。
  3. setValue() を使用して、プロパティーの value フィールドを設定します。
  4. JMSMessageHeadersType.getProperty().add(JMSPropertyType) を使用して、JMS メッセージヘッダーにプロパティーを追加します。
  5. すべてのプロパティーがメッセージヘッダーに追加されるまで、この手順を繰り返します。

クライアント受信タイムアウト

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 を取得する。

InvocationHandlerBindingProvider であるかどうかを確認する。

返された InvocationHandler オブジェクトを BindingProvider オブジェクトにキャストし、リクエストコンテキストを取得する。

リクエストコンテキストを取得します。

JMSMessageHeadersType オブジェクトを作成し、新しいメッセージヘッダーの値を保持する。

相関 ID を設定します。

エクスパレーションプロパティーを 60 分に設定します。

新しい JMSPropertyType オブジェクトを作成する。

オプションのプロパティーの値を設定します。

オプションのプロパティーをメッセージヘッダーに追加します。

JMS メッセージヘッダー値をリクエストコンテキストに設定します。

クライアントの受信タイムアウトプロパティーを 1 秒に設定します。