请在下面找到我的要求。
要求:轮询网络服务。轮询max_timeout,polling_interval的两个关键参数在属性文件中配置。总体目标是花费整个时间来获得响应。如果我们在max_timeout中获得响应,我们可以将响应返回给客户端。否则我们会抛出一个错误,说操作不成功。
以下是我编写的代码段。
int maxTimeOut = 10;
int interval = 2;
int iterations = maxTimeOut/interval;
boolean success = false;
for (int i = 0; i < iterations; i++)
{
System.out.println("Number of iteration = " + i);
try
{
Thread.sleep(interval * 1000);
System.out.println("Waited for " + interval + " seconds");
success = getWSResponse(i);
System.out.println("CALL" + ((success) ? "SUCCESSFUL" : "FAIL"));
if(success) break;
}catch (InterruptedException ie)
{
System.out.println(ie.getMessage());
}
}
//Send the success flag to client
如果这是正确的轮询实施,你能纠正我吗?我有点担心这段代码假定webservice调用立即返回。如果这需要2-3秒(通常是这样),那么我们将花费超过max_timeout总数仅用于POLLING。我们怎么能解决这个问题。有没有比这更好的方法。
答案 0 :(得分:2)
您可以将ScheduledExecutorService
与HttpURLConnection
- Timeout一起使用以在给定的延迟中进行轮询 - 并在任务更长时间内中止该任务。
答案 1 :(得分:1)
如果轮询只是意味着Web服务已启动并运行,您可以在轮询代码中尝试打开与Web服务的连接(连接超时)。如果您已成功连接,则表示Web服务已启动。
HttpURLConnection connection = null;
URL url = new URL("URL");
connection = (HttpURLConnection) url.openConnection();
connection .setConnectTimeout(timeout);//specify the timeout and catch the IOexception
connection.connect();
修改强>
或者,您可以在具有超时的任务中使用执行程序(请参阅 java.util.concurrent.ExecutorService )调用Web服务,并可以相应地做出决定。样本:
// Make the ws work a time-boxed task
final Future<Boolean> future= executor.submit(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
// get ws result
return getWSResponse();
}
});
try {
boolean result = future.get(max_wait_time, TimeUnit.SECONDS);
} catch (TimeoutException te) {
throw e;
}