Spring websevice,单个wsdl但不同的WS提供程序,性能问题

时间:2016-09-08 16:54:34

标签: multithreading spring-ws

我正面临性能问题。在我的项目中,我有一个Web服务客户端,它调用硬件实体来获取其状态和其他参数的值。我正在使用基于Soap的Spring WS。 我有大约5000个设备,我需要一次使用100-500个线程并行调用。

只需一次通话,每台设备所需的时间不到5秒。

但是当处于多线程时,时间会持续增加,从5秒增加到30秒,甚至超过100秒甚至每台设备的设备。所有设备都需要超过30分钟,根据要求应该少于2分钟。

  • 我们为每个设备提供不同的uri,因此我们动态获取URI,因此我们使用Spring的webServiceTemplate方法-marshalSendAndReceive(String uri,Object requestPayload,WebServiceMessageCallback requestCallback)。
  • WebServiceTemplate对象是singleton。
  • 只有1个wsdl但不同的设备是不同的WS提供商。

在某个地方我发现它可能是marshallers的一个问题所以我增加了单独的webServiceTemplate对象的marshallers对象的数量,但这也没有用。

请与我分享解决此类问题的想法。如果需要更多信息以解决此问题,如果我错过了分享任何信息,请告诉我。

详细阐述了这个问题:

谢谢hagrawal,是的线程无法增加响应时间,但某些线程花费的时间我无法理解但是,是的,调用实际的webservice与设备通信需要时间。我已经开始和结束时间来测量该呼叫的时间,并发现前几个设备,所花费的时间少于3-4秒,但之后,其他设备的时间不断增加。

我也检查了JVM,找不到任何与内存有关的问题但是,发现这么多线程被多次阻塞了。看起来这些阻塞线程大部分时间都在消耗。我已经获取了那些被阻塞线程的堆栈跟踪,如下所示。

pool-111757-thread-1 [13184](已阻止)

  • sun.security.ssl.Handshaker.calculateConnectionKeys line:1266
  • sun.security.ssl.Handshaker.calculateKeys line:1112
  • sun.security.ssl.ClientHandshaker.serverHelloDone line:1078
  • sun.security.ssl.ClientHandshaker.processMessage line:348
  • sun.security.ssl.Handshaker.processLoop line:979
  • sun.security.ssl.Handshaker.process_record line:914
  • sun.security.ssl.SSLSocketImpl.readRecord line:1062
  • sun.security.ssl.SSLSocketImpl.performInitialHandshake line:1375
  • sun.security.ssl.SSLSocketImpl.starHandshake line:1403
  • sun.security.ssl.SSLSocketImpl.startHandshake line:1387
  • org.apache.http.conn.ssl.SSSLConnectionSocketFactory.createLayeredSocket line:275
  • org.apache.http.conn.ssl.SSSLConnectionSocketFactory.connectSocket line:254
  • org.apache.http.impl.conn.HttpClientConnectionOperator.connect line:123
  • org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect line:318

再次告知,当调用实际的设备ws时,该方法的时间会增加。

0 个答案:

没有答案