欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

我眼中的CXF之 Interceptor (下) 博客分类: ESB Exchange配置管理工作 

程序员文章站 2024-02-22 14:03:46
...
下面给大家介绍一下Interceptor的一个使用实例,如果通过Interceptor来获取CXF的性能数据。
我们知道CXF通过Interceptor处理着各种不同不样的消息信息,如果我们能在这些消息中设置时间戳信息,那我们就可以很容易地获取到这些消息在 不同地阶段处理所耗费的时间信息,通过对这些时间戳信息的处理,我们可以很容易就获取到CXF运行时的性能数据了。

接下来我们看看CXF中管理模块是如何来实现设置时间戳信息的。

首先我们简单回顾一下CXF的消息处理流机制:

对于CXF来说消息就像是水流一样流过一个一个的过滤器(Interceptor)。消息可以按照流入流出的方向分为InMessage和OutMessage;在消息处理过程中可能会出现这样那样的错误,而这些错误信息根据其流入流出方向分为InFaultMessage和OutFaultMessage。这些进出的消息通过Exchange相互关联起来。 这样的设计给我带来一个很大的好处就是我们客户端还是在服务器端可以复用相同的Interceptor,这给设计和使用以及配置Interceptor带来了很大得方便。


如何从Interceptor中获取性能数据?

所有的Interceptor需要实现 public void handleMessage(Message message) throws Fault; 这一方法,而Message就是我们前面提到的大杂货铺。我们只需要找到消息处理的合适时机设置好对应的时间戳信息MessageHandlingTimeRecorder,并把时间戳信息寄存在Message中就完成了一大半的基础工作了。同时为了对把这些时间信息进行统计分析,这里我们设计了一个CounterRepository,Interceptor可以通过CounterRepository提供的记时方法increaseCounter(ObjectName on, MessageHandlingTimeRecorder mhtr)实现计数功能。

接下来的就是我们如何设计我们的Perfromance Interceptors了。这里需要大家能对消息的流入流出情况有一个比较清楚的认识,这里包括了消息一般都需要经过哪些阶段 Phase的处理。客户端和服务器端对于流入流出消息的都是如何进行处理的,还有就是对于Request/Response的消息与Oneway的消息其处理流程也不太相同。在这里我就不一一罗列了。有兴趣的朋友可以看看代码