在cxf中自定义jsr的简单介绍

  • 1、cxf 如何获取异常报文 在代码中是怎么实现的
  • 2、SpringBoot+CXF 实现简单的webservice,并支持Basic验证
  • 3、cxf怎样提高webservice性能,及访问速度调优

 1. 单独建立线程池,线程池中的所有工作线程从线程池任务队列中读取任务,启动SOAP报文下发工作。

2. 建立连接池,线程池中线程从连接池获取一个连接将SOAP报文下发到网元上。

3. 其他线程:SOAP报文读取线程,将生成的SOAP报文文件映射到内存文件,每次读取1w条数据到SOAP报文下发队列,SOAP下发队列数据结构进行

封装,添加信号量,每次数据push_back一条信号量递增

SOAP报文下发线程,独立的线程从SOAP报文下发队列中取数据,等待下发队列的信号,如果有信号则从队列中取数据,构建下发任务

将下发任务压入线程池工作任务队列,同时信号量递减1

SOAP报文保存线程,SOAP报文下发后会收到网元的响应报文,解析模块分析响应报文,获取SOAP发送报文的执行结果,并将执行失败

的SOAP报文进行保存,对执行成功的报文写入日志。

4. 连接池:连接池工厂,连接池,连接器实体

连接池工厂建立连接池名称和连接池实例的映射,管理所有连接池。

连接池管理所有会话连接(IOSession),建立空闲会话队列和使用会话队列,如果空闲队列为空,同时又有新的连接请求,则建立一条新的连接。

连接数不能超过最大连接数,如果已经达到最大连接数,则进入等待状态,当空闲队列空状态取消

AttachHttpHeader() // 附加Http报头

DetachHttpHeader() // 获取Http响应报头

PraseHttpHeader(); // 解析Http响应报头

队列采用状态模式,空闲状态

队列包含一个事件,类型转换操作符到事件句柄,当空闲队列为空时,事件变为无信号状态,当变为非空时变为有信号状态。每次出现这种状况都要写日志信息。

CXF内置了很多拦截器,大部分默认添加到拦截器链中,有些拦截器也可以手动添加,如CXF的日志拦截器。如果需要自定义拦截器,只要继承AbstractPhaseInterceptor或者AbstractPhaseInterceptor的子类(如AbstractSoapInterceptor)

如果是传统的spring+cxf 项目,拦截器的写法是一样的,只是发布和配置的方法在cxf的配置文件的xml中进行

WSDL 地址:

CXF 自动编译解析的客户端

客户端basic 认证调用

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

webservice的性能实在是不敢恭维。曾经因为webservice吞吐量上不

去,对webservice进行了一些性能方面的优化,采用了FastInfoset,效果很明显,极端条件下的大数据量传输,性能提高60%,他可以减

少传输成本,序列化成本和xml解析成本。

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

cxf:featurescxf:fastinfoset force=”false”//cxf:features

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

需要在pom中添加依赖:

dependency

groupIdcom.sun.xml.fastinfoset/groupId

artifactIdFastInfoset/artifactId

version1.2.9/version

typejar/type

scopecompile/scope

/dependency

FastInfoset参考:

client和service端都要配置

2、 启用gzip压缩支持

客户端和服务器端是否使用Gzip压缩,也是基于http协议协商的(检查请求

header 中是否有Accept-encoding:gzip)。但是这里需要仔细权衡下。对于小数据量,启用gzip压缩支持是吃力不讨好的行为,

数据量很小的时候,gzip压缩结果不明显,还浪费cpu。我们需要权衡数据大小,按照经验设置threshold为10*1024byte。

在bus中启用如下配置:

bean class=”org.apache.cxf.transport.common.gzip.GZIPFeature “

property name=”threshold”value10240/value/property

/bean

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

参考

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

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

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

org.apache.cxf.common.logging.Slf4jLogger

4、 测试中启用日志

bus中加入cxf:logging/,请在测试环境中启用有助于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后面加入拦截器

2、在项目测试时遇到一个报错

invalid LOC header (bad

signature),这个问题是因为jar包损坏照成的,虽然构建路径中有这个jar,但是还是会出现loadClass失败,清理maven 本地仓

库目录的jar,修改pom(比如加上一空行)让m2e重新加载。

3、Cxf中有一个很不错的特性,支持javascript访问soap

webservice,客户端访问类似的请求,会生成

javascript 客户端,js编程时就可以使用此客户端提供的对象,启用此功能需要在引入

import resource=”classpath:META-INF/cxf/cxf-extension-javascript-client.xml” /并且在依赖中加入:

dependency

groupIdorg.apache.cxf/groupId

artifactIdcxf-rt-javascript/artifactId

version2.4.1/version

typejar/type

scopecompile/scope

/dependency

原创文章,作者:FXXG7,如若转载,请注明出处:https://www.506064.com/n/126463.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
FXXG7FXXG7
上一篇 2024-10-03 23:08
下一篇 2024-10-03 23:08

相关推荐

  • Python简单数学计算

    本文将从多个方面介绍Python的简单数学计算,包括基础运算符、函数、库以及实际应用场景。 一、基础运算符 Python提供了基础的算术运算符,包括加(+)、减(-)、乘(*)、除…

    编程 2025-04-29
  • Python满天星代码:让编程变得更加简单

    本文将从多个方面详细阐述Python满天星代码,为大家介绍它的优点以及如何在编程中使用。无论是刚刚接触编程还是资深程序员,都能从中获得一定的收获。 一、简介 Python满天星代码…

    编程 2025-04-29
  • Python海龟代码简单画图

    本文将介绍如何使用Python的海龟库进行简单画图,并提供相关示例代码。 一、基础用法 使用Python的海龟库,我们可以控制一个小海龟在窗口中移动,并利用它的“画笔”在窗口中绘制…

    编程 2025-04-29
  • Python中自定义函数必须有return语句

    自定义函数是Python中最常见、最基本也是最重要的语句之一。在Python中,自定义函数必须有明确的返回值,即必须要有return语句。本篇文章将从以下几个方面对此进行详细阐述。…

    编程 2025-04-29
  • Python樱花树代码简单

    本文将对Python樱花树代码进行详细的阐述和讲解,帮助读者更好地理解该代码的实现方法。 一、简介 樱花树是一种图形效果,它的实现方法比较简单。Python中可以通过turtle这…

    编程 2025-04-28
  • Python大神作品:让编程变得更加简单

    Python作为一种高级的解释性编程语言,一直被广泛地运用于各个领域,从Web开发、游戏开发到人工智能,Python都扮演着重要的角色。Python的代码简洁明了,易于阅读和维护,…

    编程 2025-04-28
  • 用Python实现简单爬虫程序

    在当今时代,互联网上的信息量是爆炸式增长的,其中很多信息可以被利用。对于数据分析、数据挖掘或者其他一些需要大量数据的任务,我们可以使用爬虫技术从各个网站获取需要的信息。而Pytho…

    编程 2025-04-28
  • Python自定义列表

    本文将为大家介绍Python中自定义列表的方法和应用场景。对自定义列表进行详细的阐述,包括列表的基本操作、切片、列表推导式、列表的嵌套以及列表的排序,希望能够帮助大家更好地理解和应…

    编程 2025-04-27
  • 如何制作一个简单的换装游戏

    本文将从以下几个方面,为大家介绍如何制作一个简单的换装游戏: 1. 游戏需求和界面设计 2. 使用HTML、CSS和JavaScript开发游戏 3. 实现游戏的基本功能:拖拽交互…

    编程 2025-04-27
  • 如何添加Python自定义模块?

    Python是一种非常流行的脚本语言,因其易学易用和功能强大而备受欢迎。自定义模块是Python开发中经常使用的功能之一。本文将从多个方面为您介绍如何添加Python自定义模块。 …

    编程 2025-04-27

发表回复

登录后才能评论