我们有运行几个线程的代码。在线程的run事件中,我们调用2个Web服务。当达到2000号迭代时,我们遇到了性能问题。每个Web服务调用的过程大约需要600毫秒,并且随着它的继续,它可能会持续近60秒......
每个Web服务的实际执行保持一致,但端口创建变慢:
long preStartTime = System.currentTimeMillis();
ServicePortType winPort = (ServicePortType) this.getConnector().getFactory().create();
long preEndTime = System.currentTimeMillis();
LOGGER.debug("@@@Web Service Prep work (1st service) took => " + (preEndTime - preStartTime) + "ms");
这将在大约80毫秒开始时记录,并且当过程继续运行时,在2000次迭代时它可以达到50秒:
(iteration 1) @@@Web Service Prep work (1st service) took => 80ms
(iteration 2000) @@@Web Service Prep work (1st service) took => 524421ms
以下是连接器设置:
@Override
public void init(Properties prop) {
LOGGER.info("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
LOGGER.info("@@@@@@ Starting HTTPConnector @@@@@@@@@@@@@@");
LOGGER.info("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
try {
factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(ServicePortType.class);
LOGGER.debug("@@@URL : " + prop.getProperty("service.url"));
factory.setAddress(prop.getProperty("service.url"));
factory.getInInterceptors().add(new LoggingInInterceptor());
factory.getOutInterceptors().add(new LoggingOutInterceptor());
} catch (Exception ex) {
LOGGER.error(ex);
}
LOGGER.info("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
LOGGER.info("@@@@@@ End HTTPConnector @@@@@@@@@@@@@@@@@@@");
LOGGER.info("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
}
有人能指导我吗?
修改
我改变了这个被调用的部分,每次都是静态的,只创建一次。现在表现很好,但不知道这是否会影响其他任何事情。
由此:
ServicePortType winPort = (ServicePortType) this.getConnector().getFactory().create();
对此:
private static UVSInterfaceExtendPortType winPort;
if (winPort == null)
{
winPort = (UVSInterfaceExtendPortType) this.getConnector().getFactory().create();
}
答案 0 :(得分:1)
我的解决方案是只将portType实例化一次,而不是每次都实例化(如我的编辑中所述)。
我们每天进行大约100k次交易,整个交易的速度保持在一秒以下,包括2个网络服务电话和几个数据库电话。