您好我正在执行soap请求。我想运行这行代码。
int flag = 5seconds;
//下面的行不会在5秒内回来)使用soap取消第三方API呼叫并继续
if(时间为5秒) this.soapResponse = soapConnection.call(createSOAPRequest(value),url);
否则 终止并继续使用其余的代码。
我需要存储soapResponse,因此调用其他函数或类可以让我将对象传回来会很糟糕。我想要一种简单的方法来确保该行在标志设置的时间内执行。 我可以创建一个线程并等待5秒钟。如果它没有回来那么只是结束while循环
while(count to 5 seconds){
this.soapResponse = soapConnection.call(createSOAPRequest(value), url);
}
答案 0 :(得分:0)
是的,您可以为此创建一个主题。您可以使用this class来实现超时。您需要将SOAP连接调用包装在Runnable
中(或者更好,Callable<Response>
,因为您想返回一个值):
public class SoapRunnable implements Runnable {
private String value;
private String url;
private Connection soapConnection;
private Response<?> response;
public SoapCallable(Connection soapConnection, String value, String url) {
this.url = url;
this.value = value;
this.soapConnection = soapConnection;
}
@Override
public void run() {
response = soapConnection.call(createSOAPRequest(value), url);
}
public Response<?> getResponse() {
return response;
}
}
然后,您可以创建SoapRunnable
的实例并将其传递给TimeoutController
方法:
try {
TimeoutController.execute(soapRunnable, 5000);
// Call succeeded, grab result
this.soapResponse = soapRunnable.getResponse();
} catch (TimeoutException e) {
// call did not return within 5 seconds, proceed with "else" code
}
答案 1 :(得分:0)
您可以使用以下属性设置超时。
连接超时是连接第三方服务器所花费的时间,读取超时是连接和返回响应后第三方所花费的时间。
int connectionTimeOutInMs = 5000;
int readTimeOutInMs = 5000;
context.put("javax.xml.ws.client.connectionTimeout", connectionTimeOutInMs);
context.put("javax.xml.ws.client.receiveTimeout", readTimeOutInMs);
context.put("com.sun.xml.internal.ws.request.timeout", connectionTimeOutInMs);
context.put("com.sun.xml.ws.request.timeout", connectionTimeOutInMs);
context.put("com.sun.xml.ws.connect.timeout", connectionTimeOutInMs);