读书人

CXF BUS 施用

发布时间: 2013-03-29 14:24:52 作者: rapoo

CXF BUS 使用
本文版权归Stephen Wang所有。可以任意复制、转载,但请注明出处。

CXF中的BUS就是一个骨架,管理着CXF的扩展插件以及提供拦截器。注意,BUS提供的拦截器与具体的服务endpoint提供的拦截器是有一点区别的。BUS提供的拦截器将作用于所有的收到、发送以及错误(Fault)的消息。默认情况下,BUS没有为我们提供任何拦截器。

一,BUS提供全局拦截器功能

下面来举例子说明,如何为所有的endpoint提供日志拦截:

<bean id="logOutbound" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
<cxf:bus>
<cxf:outInterceptors>
<ref bean="logOutbound"/>
</cxf:outInterceptors>
</cxf:bus>

上面提供了拦截所有出去的消息日志。可以提供的拦截点包括:

NameValue
inInterceptors拦截接收到的消息
inFaultInterceptors拦截接收错误消息
outInterceptors拦截发出去的消息
outFaultInterceptorsl拦截发出去的错误消息
这个拦截器与各endpoint的拦截器一样,需要实现Interceptor接口。这些拦截器都是作用于全局的。

二、CXF bus提供了一些feature。通过配置即可激活这些功能。

举例来说,bus有一个logging的feature。能够拦截所有的进入、发出以及错误的消息。呵呵,不需要配置拦截器咯,激活这个功能即可。实现这个功能的是org.apache.cxf.feature.LoggingFeature类。下面举例说明如何激活这个feature:

<cxf:bus>
<cxf:features>
<cxf:logging/>
</cxf:features>
</cxf:bus>

比较简单,这样就可以输出日志了。它还提供了其他的一些feature,可以参考:

http://cxf.apache.org/docs/featureslist.html。用到的话可以查询下了。具体用法参考上面的例子即可。大概提供的feature涵盖了故障转移、加解密消息、压缩解压消息,ws-address支持,ws-policy支持以及轻量级消息转发。

当然,你也可以扩展自己的featrue,只需要继承AbstractFeature并实现initializeProvider 这个方法即可。这个方法提供了修改InterceptorProvider 的机会。查看InterceptorProvider 接口即知道,这个接口提供了访问上面提到的四个拦截的入口。

public interface InterceptorProvider {

List<Interceptor> getInInterceptors();

List<Interceptor> getOutInterceptors();

List<Interceptor> getInFaultInterceptors();

List<Interceptor> getOutFaultInterceptors();

}

三、CXF bus还管理了扩展插件(extension)


如果把 CXF BUS翻译为公交车(或者叫比喻吧),感觉还是比较能表明它所代表的含义的。bus是一辆公交车,那么售票员就相当于拦截器了。而公交公司就像是一个feature了,它管理所有的售票员和bus的其它东西。公交车上的座位就是这里的extension了。它提供了一些位置供这些扩展对象使用。当公交车到达一个站时,从这些座位上取出对象,然后进行处理(这些座位上的貌似不能下车,呵呵)。当然,也有一些reserved的座位,供cxf自己使用,比如 DestinationFactoryManager 可以在运行时从extension中获取,

Bus bus = BusFactory.getThreadDefaultBus();
DestinationFactoryManagerImpl dfm = bus.getExtension(DestinationFactoryManagerImpl.class);

类似的还有BindingFactoryManager.ConduitInitiatorManager等。这些是专用位置哦。一般,这些可用对象可以从classpath以下路径看到:

META-INF/cxf/cxf.xml (e.g., in cxf-rt-core only)
META-INF/cxf/cxf-extension.xml (e.g. in cxf-rt-bindings-soap)
META-INF/cxf/cxf-property-editors.xml (e.g. in cxf-rt-transports-http)

例如:可以从cxf-rt-core-****.jar包中的META-INF/cxf/cxf-extension.xml 文件中,看到以下已经注入的对象org.apache.cxf.wsdl11.WSDLManagerImpl,org.apache.cxf.phase.PhaseManagerImpl等等。

当然,你可以自定义extension。并且在自己的jar包的META-INF/cxf/cxf-extension.xml这个路径中,配置你自己的bean。这个bean是一个POJO的bean,不需要实现任何依赖于cxf的接口。当然,你也可以扩展cxf已有的功能。配置完成后,你可以在运行时bus.getExtension(your.class);来获取你的扩展啦。

我觉得这个设计虽然灵活,但设计的过于灵活啦,只是简单的把这些可用的bean放入一个map里面,以供查询使用。违背了面向对象的设计原则。我相信很多读者到这都会感觉,这个扩展可以扩展的东西其实是无限的,但刚开始却会让你无从下手。

本文版权归Stephen Wang所有。可以任意复制、转载,但请注明出处。

读书人网 >开源软件

热点推荐