CXF client在并发下的线程安全问题
2009-09-24 00:00:00 来源:WEB开发网看来问题是出现在这里了。
进一步的测试发现,低压力下比如2-3个工作线程,基本不会有任何问题,因此可以解释为什么功能测试时不出现问题。工作线程加到10个,基本上还算问题,只有极其偶然的会出现一次两次这个异常。进一步加大工作线程,由于受到测试机器的性能限制,10个工作线程和100个工作线程的tps基本相同,都大体在 300TPS左右(客户端在笔记本上跑的,cpu已经90%+了)。测试的结果是上面的异常开始变的有规律,恩,非常搞笑的规律,大概每10000次左右的请求就发生一次上述异常,非常的稳定而执着的重现。服了,这么有规律而重现性极好的错误,还真是难得一见........
分析一下问题,在tps基本保持不变的情况下,客户端线程从10增加到100问题就变得明显。因此问题的焦点直指线程安全这个老大难问题,重新审视我们使用cxf的代码,发现有个地方
/**
* the server service
*/
MessagingChannelServiceImplService mcsis = null;
/**
* the sever service port
*/
MessagingChannelService mcs = null;
mcsis = new MessagingChannelServiceImplService(serviceWsdlUrl);
mcs = mcsis.getMessagingChannelServiceImplPort();
MessagingChannelService是cxf自动生成的,这个是@WebService,其他的业务代码都是调用它上面的业务方法来实现。由于serviceWsdlUrl不变,因此我们重用了一些东西,避免每次都初始化一次。看来问题出现在这里,试着将代码修改为threadlocal,让每个线程都初始化一次然后保存给自己使用。
更多精彩
赞助商链接