java实现:轮询Web服务

时间:2012-01-23 07:04:45

标签: java web-services algorithm java-ee webservice-client

请在下面找到我的要求。

要求:轮询网络服务。轮询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。我们怎么能解决这个问题。有没有比这更好的方法。

2 个答案:

答案 0 :(得分:2)

您可以将ScheduledExecutorServiceHttpURLConnection - 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;
}