使用axis2构建webservice时客户端内存不断增长导致应用服务器频繁重启的解决方案

使用axis2构建webservice时,发现系统运行一段时间后客户端的内存使用一直不断增高,导致应用服务器无法承受而重启,这里提供了一种解决方案。

原因分析:客户端以stub方式请求服务,stub对象是一个非常重量级的对象,每次客户端向服务端请求服务时,stub对象不断被创建,占用大量系统资源

解决方案:考虑到所有的客户端stub都继承自org.apache.axis2.client.Stub类,考虑使用简单工厂模式+简单的对象池来提供stub对象实例,这样只需首次需要stub对象时实例化一次,以后需要用的时候从stub对象池中取得,工厂类本身做成单例模式。

代码实现:

  1. public class StubFactory{
  2. //从配置文件中取客户端应用context的绝对路径
  3. public static final String path=ServiceConfig.getPath();
  4. //从配置文件中取服务url
  5. public static final String serviceUrl=ServiceConfig.getServiceUrl();
  6. private static Map map=new HashMap();//这里可以是一个同步的Map,也可以直接用Hashtable
  7. private static ConfigurationContext configurationContext=null;
  8. private static StubFactory stubFactory=new StubFactory();
  9. private StubFactory(){};
  10. static{
  11. try{
  12. configurationContext=ConfigurationContextFactory.createConfigurationContextFromFileSystem(path+"/WEB-INF",path+"/WEB-INF/conf/axis2.xml");
  13. }catch(AxisFault e){
  14. e.printStackTrace();
  15. }
  16. }
  17. public Stub getStub(String type){
  18. Stub stub=null;
  19. if(map.get(type)==null){
  20. stub=(Stub)this.createStub(type);
  21. map.put(type,stub);
  22. }
  23. return (Stub)map.get(type);
  24. }
  25. private Stub createStub(String type){
  26. Stub stub=null;
  27. String targetEndpoint=null;
  28. try{
  29. if("SearchServiceStub".equals(type)){
  30. targetEndpoint=serviceUrl+"services/SearchService.SearchServiceHttpSoap12Endpoint/";
  31. stub=new SearchServiceStub(configurationContext,targetEndpoint);
  32. }
  33. if("CalculateServiceStub".equals(type)){
  34. targetEndpoint=serviceUrl+"services/CalculateService.CalculateServiceHttpSoap12Endpoint/";
  35. stub=new CalculateServiceStub(configurationContext,targetEndpoint);
  36. }
  37. if("MessageServiceStub".equals(type)){
  38. targetEndpoint=serviceUrl+"services/MessageService.MessageServiceHttpSoap12Endpoint/";
  39. stub=new MessageServiceStub(configurationContext,targetEndpoint);
  40. }
  41. }catch(Exception e){
  42. e.printStackTrace();
  43. }
  44. return stub;
  45. }
  46. public static StubFactory getInstance(){
  47. return stubFactory;
  48. }
  49. }

取stub对象只要如下代码:

  1. SearchServiceStub stub=(SearchServiceStub)StubFactory.getInstance().getStub("SearchServiceStub");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值