情况是这样的:
我使用 Axis2 1.6.2 并为 2 个 Web 服务生成了存根(使用wsdl2java )——我们称它们为WS#1和WS#2。
我通过实现扩展 BasePoolableObjectFactory (org.apache.commons.pool.BasePoolableObjectFactory) 的 StubPoolableFactory 为存根使用池机制
为了实现这一点,存根由作为单例的适配器“包装”。适配器的骨架如下所示:
/** The Adapter class */
public class PdfServiceAdapter extends PoolableStubAdapter<PdfServiceStub> {
/** The Singleton. */
private static PdfServiceAdapter pdfServiceAdapter;
/**
* Gets the PdfService adapter instance.
*
* @return the PdfService adapter
*/
public synchronized static PdfServiceAdapter getPdfServiceAdapter() {
if (null == pdfServiceAdapter) {
pdfServiceAdapter = new PdfServiceAdapter();
pdfServiceAdapter.initiateStubPool();
}
return pdfServiceAdapter;
}
public void doSomething() throws AdapterException {
try {
stub = getStub();
} catch (final Exception e) {
throw new AdapterPreparationException(e);
}
try {
//call some actual Stub method here...
} catch (final Exception e) {
stopWatch.stop("PdfService.doSomething.FAILURE");
throw new AdapterExecutionException(e);
} finally {
final ServiceClient client = stub._getServiceClient();
if (client != null) {
try {
client.cleanupTransport();
client.cleanup();
} catch (final AxisFault e) {
log.warn("Something went wrong while cleaning up service client: ", e);
}
}
releaseStub(stub);
}
}
@Override
protected int getMaxActive() {
return Integer.parseInt(ESignatureConfig.getInstance().getConfig().getString(
"AXIS_STUB_POOL_EREQUEST_COMMUNICATION_MAX_ACTIVE"));
}
@Override
protected boolean getLifo() {
return Boolean.parseBoolean(ESignatureConfig.getInstance().getConfig().getString(
"AXIS_STUB_POOL_EREQUEST_COMMUNICATION_LIFO_FLAG"));
}
@Override
protected int getMaxIdle() {
return Integer.parseInt(ESignatureConfig.getInstance().getConfig().getString(
"AXIS_STUB_POOL_EREQUEST_COMMUNICATION_MAX_IDLE"));
}
@Override
protected long getMaxWait() {
return Integer.parseInt(ESignatureConfig.getInstance().getConfig().getString(
"AXIS_STUB_POOL_EREQUEST_COMMUNICATION_MAX_WAIT"));
}
@Override
protected String getEndPointURL() {
return ESignatureConfig.getInstance().getConfig().getString("PDF_SERVICE_ENDPONT");
}
@Override
protected Stub getInstance() throws Exception {
return new PdfServiceStub(AxisConfigurationContextFactory.getInstance().getConfigurationContext());
}
}
正如您在请求存根实例时所看到的,轴配置被传递给存根。这个 Axis 配置是从工厂返回的,它是一个单例,并且基于 MultiThreadedHttpConnectionManager 和缓存的 HTTP 客户端。
现在,问题出在哪里:
- 有时并且通常在调用 Web 服务很长时间之后,如果我们调用WS#1并且在WS#2之后,调用 WS#2 时会出现Connection Reset 错误。如果在此连接重置后,我们再次调用 WS#1 和 WS#2,那么没问题。
- 此外,我们在对应用程序进行压力测试时也没有问题。只有当我们让它空闲并且只有当调用“back 2 back” WS#1和 WS#2 时,连接重置才会发生在 WS#2 调用上。
您认为这与我的实施有关吗?也许单例轴配置或某些情况下缓存的 HTTP 客户端负责此重置?