我需要实现一个Web服务,它执行以下步骤:
如果我的网络服务在5秒后没有收到来自B的回复,则必须向A发送适当的答案并停止等待来自B的回答。
我使用wsimport工具为Web服务B生成了客户端。据我所知,我应该为生成的客户端设置超时。我对吗? 我找到了以下解决方案:
((BindingProvider)portB).getRequestContext().put("javax.xml.ws.client.connectionTimeout", "1000");
((BindingProvider)portB).getRequestContext().put("javax.xml.ws.client.receiveTimeout", "1000");
但我不喜欢这个解决方案,原因有两个:
1。它对我不起作用
我编写了简单的服务B模拟器,它接收来自我的Web服务的响应并发送模拟回复。为了测试超时,我将此代码添加到模拟服务B:
try {
Thread.sleep(15 * 1000);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
此测试显示那些具有BindingProvider属性的行不起作用。我的网络服务只需等待15秒,而不是在1秒后停止。 我已经看到这些参数的名称很少有其他变体(其中一些用于JBoss和Glassfish),但它们都不适用于我。 我使用Tomcat 8作为模拟服务B的应用服务器。
2。它并非适用于所有应用程序服务器。
据我所知,每个应用服务器都有唯一的超时参数名称。如果Web服务B站在JBoss上,那么我应该使用
((BindingProvider)portB).getRequestContext().put(TIMEOUT_PARAMS_NAME_FOR_JBOSS, "2000");
但是如果Web服务B站在WebSphere上而不是我使用
((BindingProvider)portB).getRequestContext().put(TIMEOUT_PARAMS_NAME_FOR_WEBSPHERE, "2000");
等等。 但是,如果我不知道Web服务B使用哪个应用程序服务器呢?我对这一刻有点困惑。也许我只是误解了什么?
那么在我的情况下,避免长时间等待Web服务B响应的正确方法是什么?