CXF 性能调优

CXF 性能调优1 nbsp nbsp 启用 FastInfoset 快速信息集 webservice 的性能实在是不敢恭维 曾经因为 webservice 吞吐量上不去 对 webservice 进行了一些性能方面的优化 采用了 FastInfoset 效果很明显 极端条件下的大数据量传输 性能提高 60 他可以减少传输成本 序列化成本和 xml 解析成本 Cxf 提供了 FastInfoset 协商机制 实现类见 org apache cxf

1、  启用FastInfoset(快速信息集)

webservice的性能实在是不敢恭维。曾经因为webservice吞吐量上不去,对webservice进行了一些性能方面的优化,采用了FastInfoset,效果很明显,极端条件下的大数据量传输,性能提高60%,他可以减少传输成本,序列化成本和xml解析成本。

Cxf提供了FastInfoset协商机制,实现类见org.apache.cxf.feature.FastInfosetFeature,在bus中启用如下配置:



Force=false表示服务端和客户端第一次通信时会协商(通过检查标准的HTTP头的Accept字段,值为MIME类型的application/fastinfoset)是否启用FastInfoset支持,如果客户端不支持,则不启用快速信息集。

需要在pom中添加依赖:


com.sun.xml.fastinfoset


FastInfoset


1.2.9


jar


compile

FastInfoset参考:http://java.sun.com/developer/technicalArticles/xml/fastinfoset/

client和service端都要配置

2、  启用gzip压缩支持

客户端和服务器端是否使用Gzip压缩,也是基于http协议协商的(检查请求header 中是否有Accept-encoding:gzip)。但是这里需要仔细权衡下。对于小数据量,启用gzip压缩支持是吃力不讨好的行为,数据量很小的时候,gzip压缩结果不明显,还浪费cpu。我们需要权衡数据大小,按照经验设置threshold为10*1024byte。

在bus中启用如下配置:


10240

官方文档指定是是配置org.apache.cxf.transport.http.gzip.GZIPFeature,但是这个类会找不到,可能是官方文档年久失修,造成一些混乱。官方文档中也没提示指定threshold,请参考GZIPFeature源代码。

参考http://cxf.apache.org/docs/featureslist.html

 

3、  使用slf4j代替cxf默认日志组件

CXF 默认使用java.util.logging作为日志打印组件,其性能我就不过多评价,也不太便于我们做统一日志管理。目前系统使用的slf4j作为日志打印组件,替换如下:

在classpath中加入META-INF/cxf/org.apache.cxf.Logger文件,文件内容为

  • org.apache.cxf.common.logging.Slf4jLogger

4、  测试中启用日志

bus中加入
,请在测试环境中启用有助于debug

 

 

补充:

1、如何自定义返回码:

请求在service中处理遇到异常后,会调用请求链中所有拦截器的handleFault方法,参考PhaseInterceptorChain#unwind,然后判断请求是否单向请求,如果不是,则构建异常请求链,并构建异常message对象,调用异常请求链中的handleMessage 方法(参考:AbstractFaultChainInitiatorObserver)

JAXWSMethodInvoker转发soap请求到指定对象的方法,如果在请求处理失败,调用updateHeader方法,把请求时的soap header放入返回header中。但是不同通过继承JAXWSMethodInvoker来实现清除异常时soap header也返回给客户端的问题,因为JAXWSMethodInvoker没有采用注入的机制(JaxWsServerFactoryBean#createInvoker)也没有chain.异常时,会由这些拦截器处理返回请求:

setup [ServerPolicyOutFaultInterceptor]

prepare-send [MessageSenderInterceptor, Soap11FaultOutInterceptor]

pre-stream [LoggingOutInterceptor, StaxOutInterceptor]

pre-protocol [WebFaultOutInterceptor]

write [SoapOutInterceptor]

拦截器初始化类OutFaultChainInitiatorObserver

我们可以在异常链中加入清理soap header的拦截器SoapHeaderOutFilterInterceptor,清理掉在系统异常时soapheader中有信息的问题。

返回错误状态码,在执行Soap11FaultOutInterceptor拦截器中被写死。

message.put(org.apache.cxf.message.Message.RESPONSE_CODE, new Integer(500));

为了使返回数据中有错误码,需要在Soap11FaultOutInterceptor后面加入拦截器

 

并且在依赖中加入:


org.apache.cxf


cxf-rt-javascript


2.4.1


jar


compile

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207818.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午1:02
下一篇 2026年3月19日 下午1:02


相关推荐

  • fsync、synchronous_commit 的简单测试

    fsync、synchronous_commit 的简单测试fsync(boolean)如果打开这个参数,PostgreSQL服务器将尝试确保更新被物理地写入到磁盘,做法是发出fsync()系统调用或者使用多种等价的方法(见wal_sync_method)。这保证了数据库集簇在一次操作系统或者硬件崩溃后能恢复到一个一致的状态。虽然关闭fsync常常可以得到性能上的收益,但当发生断电或系统崩溃时可能造成不可恢复的数据损坏。因此,只有在能很容易地从外部数据中重

    2022年5月31日
    42
  • FusionXpark™:OpenClaw 企业级本地部署的专属 “虾场”

    FusionXpark™:OpenClaw 企业级本地部署的专属 “虾场”

    2026年3月12日
    1
  • GPT分区下仅还原Win7 C盘,启动失败:引导文件缺失或EFI配置错误

    GPT分区下仅还原Win7 C盘,启动失败:引导文件缺失或EFI配置错误

    2026年3月16日
    2
  • java缓存设置_缓存数据可以清除吗

    java缓存设置_缓存数据可以清除吗1、@Cacheable(key="#vo.toString()",value="licence")//载入缓存2、@CacheEvict(key="#vo.toString()",value="licence")//清除缓存3、缓存设置在service层生效4、config目录下建ehcache.xml5、ehcache.xml配置如下<ehcachex…

    2022年10月4日
    4
  • php cas单点登录

    php cas单点登录一、CAS简介1、结构体系从结构体系看,CAS包括两部分:CASServer和CASClient。1.1、CASServerCASServer负责完成对用户的认证工作,需要独立部署,CASServer会处理用户名/密码等凭证(Credentials)。1.2、CASClient负责处理对客户端受保护资源的访问请求,

    2022年6月4日
    130
  • 【IDEA】控制台输出中文出现乱码的解决办法之一。

    【IDEA】控制台输出中文出现乱码的解决办法之一。在使用 IDEA 的过程中发现有时候输出在控制台上的内容如果是中文的话会出现乱码的问题 例如这样 这里我只举出了一种解决办法 因为我试过很多方法直到这个方法才解决问题 1 点击 IDEA 右上角运行服务器栏 2 点击 EditConfigur 3 在弹出的信息框中左侧会显示你所有可运行的服务器 右侧则是对其进行设置 这里选择出现乱码的服务器然后在 VMoptions 那一栏中输入 Dfile encoding UTF 8 然后点击 Apply 或者 OK 保存即可 再次测试就

    2026年3月27日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号