58.2. 处理消息

概述

在正常消息处理中,调用拦截器的 handleMessage() 方法。它将消息数据作为 Message 对象接收。除了消息的实际内容外,Message 对象可以包含与消息或消息处理状态相关的多个属性。Message 对象的确切内容取决于链中当前拦截器之前的拦截器。

获取消息内容

Message 接口提供了可在提取消息内容时使用的方法:

  • public<T&gt; T getContentjava.lang.Class<T> format The getContent() 方法返回指定类对象中的消息内容。如果内容作为指定类的实例不可用,则返回 null。可用内容类型列表由拦截器链上的拦截器位置和拦截器链的方向决定。
  • publicCollection&lt;Attachment& gt; getAttachments() 方法返回一个包含与消息关联的任何二进制附件的 Java Collection 对象。该附件存储在 org.apache.cxf.message.Attachment 对象中。附加对象提供管理二进制数据的方法。

    重要

    Attachments 仅在附件处理拦截器执行后可用。

确定消息的方向

可以通过查询消息交换来确定消息的方向。消息交换将入站消息和出站消息存储在单独的属性中。[3]

与消息关联的消息交换是通过消息的 getExchange() 方法来检索。如 例 58.1 “获取消息交换” 所示,getExchange() 不会取任何参数,并将消息交换返回为 org.apache.cxf.message.Exchange 对象。

例 58.1. 获取消息交换

ExchangegetExchange

Exchange 对象有四个方法,在 例 58.2 “从消息交换获取信息” 中显示,用于获取与交换关联的信息。每个方法都将返回消息作为 org.apache.cxf.Message 对象,如果消息不存在,则返回 null。

例 58.2. 从消息交换获取信息

MessagegetInMessageMessagegetInFaultMessagegetOutMessagegetOutFaultMessage

例 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] 它还会单独存储入站和出站故障。