58.2. 处理消息
概述
在正常消息处理中,调用拦截器的 handleMessage ()
方法。它接收消息数据作为一个 Message 对象。除了消息的实际内容外,Message 对象还可以包含与消息或消息处理状态相关的多个属性。Message 对象的确切内容取决于链中当前拦截器前面的拦截器。
获取消息内容
-
公共
<T>
>; T
getContent
java.lang.Class<T格式
ThegetContent ()
方法在指定类的对象中返回消息的内容。如果内容不作为指定类的实例使用,则返回 null。可用内容类型列表由拦截器链中的位置和拦截器链的方向决定。 公共
集合<Attachment
>
方法返回 JavagetAttachments
()Collection
对象,其中包含与消息关联的任何二进制附加。attachments 存储在 org.apache.cxf.message.Attachment 对象中。attachment 对象提供管理二进制数据的方法。重要attachments 仅在附加处理拦截器执行后可用。
确定消息的方向
可以通过查询消息交换来确定消息的方向。消息交换将入站消息和出站消息存储在单独的属性中。[3]
使用消息的 getExchange ()
方法检索与消息关联的消息交换。如 例 58.1 “获取消息交换” 所示,getExchange
() 不使用任何参数,并返回消息交换作为 org.apache.cxf.message.Exchange 对象。
例 58.1. 获取消息交换
Exchange
getExchange
Exchange 对象有四个方法,如 例 58.2 “从消息交换中获取消息” 所示,用于获取与交换关联的消息。每个方法都返回消息作为 org.apache.cxf.Message 对象,如果消息不存在,它将返回 null。
例 58.2. 从消息交换中获取消息
Message
getInMessage
Message
getInFaultMessage
Message
getOutMessage
Message
getOutFaultMessage
例 58.3 “检查证书链的方向” 显示用于确定当前消息是否出站性的代码。该方法获取消息交换,并检查当前消息是否与交换的出站消息相同。它还会根据交换出站故障故障消息检查当前消息,到出站故障拦截器链上的错误消息。
例 58.3. 检查证书链的方向
public static boolean isOutbound() { Exchange exchange = message.getExchange(); return message != null && exchange != null && (message == exchange.getOutMessage() || message == exchange.getOutFaultMessage()); }
Example
例 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 } } ... }