第 60 章 在 Fly 操作 Interceptor Chains
摘要
拦截器可以重新配置端点的拦截器链,作为其消息处理逻辑的一部分。它可添加新的拦截器、删除拦截器、重新排序拦截器,甚至挂起拦截器链。任何通常操作都是特定于调用的,因此每次涉及消息交换时,都会使用原始链。
概述
只有在消息交换被创建时,拦截器链才会有效。每个消息都包含对负责进行处理的拦截器链的引用。开发人员可以使用此引用来更改消息的拦截器链。因为链是按更改的,对消息拦截器链的任何更改都不会影响其他消息交换。
链生命周期
链中拦截器链和拦截器会基于每个调用进行实例化。当调用端点以参与消息交换时,所需的拦截器链会与拦截器的实例实例化。当导致创建拦截器链的消息交换完成后,链及其拦截器实例将被销毁。
这意味着,您对拦截器链或拦截器的字段所做的任何更改都不会在消息交换中保留。因此,如果拦截器将另一个拦截器放在活跃链中,则只影响活跃链。将来的消息交换都将从 pristine 状态创建,具体由端点的配置决定。这也意味着开发人员无法在修改将来的消息处理的拦截器中设置标记。
如果拦截器需要与将来的实例一起传递信息,它可以在消息上下文中设置属性。该上下文在消息交换之间保留。
获取拦截器链
更改消息的拦截器链的第一步是获取拦截器链。这通过使用 例 60.1 “获取拦截器链的方法” 中显示的 Message.getInterceptorChain()
方法来实现。拦截器链返回为 org.apache.cxf.interceptor.InterceptorChain 对象。
例 60.1. 获取拦截器链的方法
InterceptorChain
getInterceptorChain
添加拦截器
InterceptorChain 对象有两个方法,如 例 60.2 “将拦截器添加到拦截器链的方法”,用于将拦截器添加到拦截器链中。您可以使用一个拦截器添加单个拦截器,您可以添加多个拦截器。
例 60.2. 将拦截器添加到拦截器链的方法
添加
Interceptor<? 扩展消息>
i
add
Collection<Interceptor<? 扩展 Message>
i
例 60.3 “将拦截器添加到拦截器链中” 显示将单一拦截器添加到消息拦截器链的代码。
例 60.3. 将拦截器添加到拦截器链中
void handleMessage(Message message) { ... AddledIntereptor addled = new AddledIntereptor(); InterceptorChain chain = message.getInterceptorChain(); chain.add(addled); ... }
例 60.3 “将拦截器添加到拦截器链中” 中的代码执行以下操作:
实例化拦截器的副本来添加到链中。
添加到链中的拦截器应该处于与当前拦截器相同的阶段,或者与当前拦截器不同。
获取当前消息的拦截器链。
将新拦截器添加到链中。
删除拦截器
InterceptorChain 对象有一个方法,如 例 60.4 “从拦截器链中删除拦截器的方法”,用于从拦截器链中删除拦截器。
例 60.4. 从拦截器链中删除拦截器的方法
删除
Interceptor<? 扩展消息>
i
例 60.5 “从拦截器链中删除拦截器” 显示从消息拦截器链中删除拦截器的代码。
例 60.5. 从拦截器链中删除拦截器
void handleMessage(Message message)
{
...
Iterator<Interceptor<? extends Message>> iterator =
message.getInterceptorChain().iterator();
Interceptor<?> removeInterceptor = null;
for (; iterator.hasNext(); ) {
Interceptor<?> interceptor = iterator.next();
if (interceptor.getClass().getName().equals("InterceptorClassName")) {
removeInterceptor = interceptor;
break;
}
}
if (removeInterceptor != null) {
log.debug("Removing interceptor {}",removeInterceptor.getClass().getName());
message.getInterceptorChain().remove(removeInterceptor);
}
...
}
其中 InterceptorClassName
是您要从链中删除的拦截器的类名称。