реализация Java: опрос веб-службы - PullRequest
2 голосов
/ 23 января 2012

Пожалуйста, найдите ниже мое требование.

Требование: Опрос веб-службы.Два важных параметра опроса 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 в целом на один только опрос.Как мы могли это исправить.Есть ли лучший подход, чем этот.

Ответы [ 2 ]

2 голосов
/ 23 января 2012

вы можете комбинировать использование ScheduledExecutorService с HttpURLConnection -Timeout для опроса с заданной задержкой - и отменить задачу, если это займет больше времени.

1 голос
/ 23 января 2012

Если опрос просто означает, что веб-служба запущена и работает, в своем коде опроса вы можете попытаться открыть соединение с веб-службой (с тайм-аутом подключения). Если вы успешно можете подключиться, это означает, что веб-служба работает.

HttpURLConnection connection = null;
URL url = new URL("URL");
connection = (HttpURLConnection) url.openConnection();
connection .setConnectTimeout(timeout);//specify the timeout and catch the IOexception
connection.connect();

EDIT

В качестве альтернативы вы можете вызвать веб-службу с помощью исполнителя (см. java.util.concurrent.ExecutorService ) в задаче с тайм-аутом и можете принять соответствующее решение. Образец:

// 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;
}
...