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 オブジェクトに保存されます。attachment オブジェクトは、バイナリーデータを管理するメソッドを提供します。

    重要

    添付ファイルは、添付ファイルの処理インターセプターの実行後にのみ利用できます。

メッセージの方向の決定

メッセージの方向は、メッセージ交換を照会することで判断できます。メッセージ交換は、インバウンドメッセージとアウトバウンドメッセージを別のプロパティーに保存します。[3]

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

例58.1 メッセージ交換の取得

ExchangegetExchange

Exchange オブジェクトには、例58.2「メッセージエクスチェンジからのメッセージの取得」 に示される 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] また、インバウンドおよびアウトバウンドの障害を個別に保存します。