Menu Close

58.2. メッセージの処理

概要

通常のメッセージ処理では、インターセプターの handleMessage() メソッドが呼び出されます。そのメッセージデータを Message オブジェクトとして受け取ります。メッセージの実際の内容とともに、Message オブジェクトには、メッセージまたはメッセージ処理の状態に関連する多くのプロパティーが含まれる可能性があります。Message オブジェクトの正確な内容は、チェーンの現在のインターセプターの前にあるインターセプターによって異なります。

メッセージコンテンツの取得

Message インターフェースは、メッセージの内容を抽出するために使用できる 2 つのメソッドを提供します。

  • public<T> TgetContentjava.lang.Class<T> format getContent() メソッドは指定されたクラスのオブジェクトにあるメッセージの内容を返します。指定されたクラスのインスタンスとしてコンテンツが利用できない場合、null が返されます。利用可能なコンテンツ型のリストは、インターセプターチェーン上のインターセプターの場所とインターセプターチェーンの方向によって決まります。
  • publicCollection<Attachment>getAttachments getAttachments() メソッドは、メッセージに関連するバイナリーアタッチメントを含む Java Collection オブジェクトを返します。アタッチメントは org.apache.cxf.message.Attachment オブジェクトに保存されます。アタッチメントオブジェクトは、バイナリーデータを管理するメソッドを提供します。

    重要

    アタッチメントは、アタッチメント処理インターセプターの実行後にのみ利用できます。

メッセージの方向の決定

メッセージの方向は、メッセージエクスチェンジをクエリーすることで決定できます。メッセージエクスチェンジは、インバウンドメッセージとアウトバウンドメッセージを別のプロパティーに保存します。[3]

メッセージに関連付けられたメッセージエクスチェンジは、メッセージの getExchange() メソッドを使用して取得されます。例58.1「メッセージエクスチェンジの取得」 にあるように、getExchange() はパラメーターを取らず、メッセージエクスチェンジを org.apache.cxf.message.Exchange オブジェクトとして返します。

例58.1 メッセージエクスチェンジの取得

ExchangegetExchange

例58.2「メッセージエクスチェンジからのメッセージの取得」 にあるように、Exchange オブジェクトには、エクスチェンジに関連付けられたメッセージを取得するための 4 つのメソッドがあります。各メソッドは、メッセージを org.apache.cxf.Message オブジェクトとして返すか、メッセージが存在しない場合は null を返します。

例58.2 メッセージエクスチェンジからのメッセージの取得

MessagegetInMessageMessagegetInFaultMessageMessagegetOutMessageMessagegetOutFaultMessage

例58.3「メッセージチェーンの方向の確認」 は、現在のメッセージが送信されるかどうかを判断するためのコードを表しています。このメソッドは、メッセージエクスチェンジを取得し、現在のメッセージがエクスチェンジのアウトバウンドメッセージと同じかどうかを確認します。また、現在のメッセージを、アウトバウンド障害インターセプタチェーン上のエラーメッセージへのエクスチェンジのアウトバウンド障害メッセージと照合します。

例58.3 メッセージチェーンの方向の確認

public static boolean isOutbound()
{
   Exchange exchange = message.getExchange();
        return message != null
               && exchange != null
               && (message == exchange.getOutMessage()
                   || message == exchange.getOutFaultMessage());
}

例58.4「メッセージ処理メソッドの例」 は、zip の圧縮メッセージを処理するインターセプターのコードを表しています。これはメッセージの方向を確認し、適切なアクションを実行します。

例58.4 メッセージ処理メソッドの例

import java.io.IOException;
import java.io.InputStream;
import java.util.zip.GZIPInputStream;

import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;

public class StreamInterceptor extends AbstractPhaseInterceptor<Message>
{

  ...

  public void handleMessage(Message message)
  {

        boolean isOutbound = false;
        isOutbound = message == message.getExchange().getOutMessage()
               || message == message.getExchange().getOutFaultMessage();

        if (!isOutbound)
        {
          try
          {
             InputStream is = message.getContent(InputStream.class);
             GZIPInputStream zipInput = new GZIPInputStream(is);
             message.setContent(InputStream.class, zipInput);
          }
          catch (IOException ioe)
          {
             ioe.printStackTrace();
           }
        }
         else
        {
         // zip the outbound message
        }
    }
  ...
}


[3] また、インバウンドおよびアウトバウンドの障害も別々に格納します。