Webservice CXF 线程安全问题

一、问题场景

同JVM多WebService地址调用,在并发场景下会出现线程安全问题,现象就是请求调错地址。示例场景:同一个应用按照不同省区部署,不同省区之间通过不同的WebService地址进行访问,业务上通过不同的省区编码获取不同的WebService地址进行不同的省区服务调用,此时在并发场景下就会出现线程安全问题。示例图如下:

二、问题源码分析

调用客户端采用的是手动创建,代码示例如下:

但从代码上来看,每次都是新new的对象原则上是不会产生线程安全问题,同时通过源码分析,找到BusFactory.getDefaultBus()方法,会发现他采用的是静态对象,代码示例如下:

这样的话,在并发场景的情况,静态变量就有可能别其他线程访问者给替换到,倒置调用到别的地址上去。至此找到问了问题原因,那如果解决当前问题呢,参考下文:

三、问题解决

通过源码查找,我们找到了每次都创建新的BUS类方法

Bus bus = BusFactory.newInstance().createBus();

调整后的代码示例如下:

查看createBus方法实现,会发现每次都是新new的ExtensionManagerBus对象。至此问题解决

四、其他优化建议

在高并发场景下,如果每次都去新new类在去创建连接,同时通过三次捂手创建连接,系统性能开销较大。可以尝试在服务端开启连接保持,同时,在客户端通过地址对连接客户端进行缓存。请求过来后,优先通过地址key从缓存里获取客户端信息直接进行访问调取,这样将会大大的减小性能开销。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猩火燎猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值