Регистрация по URL для асинхронных уведомлений? - PullRequest
3 голосов
/ 25 июня 2010

Я пытаюсь понять больше об асинхронных уведомлениях.У меня есть URL в виде:

http://www.sample.com/AsyncNotify?sessionId=xxxxxx

Теперь, если я вызываю этот URL с помощью sessionId, это эквивалентно регистрации для асинхронных уведомлений.Я использую библиотеку Apache HTTP Commons для выполнения Http Post и Get.Если это так, то как я могу получать события со стороны сервера?Должен ли я забыть этот подход и использовать вместо него сокеты?В настоящее время это мой подход:

HttpClient httpClient = new HttpClient;
String url = "http://www.sample.com/AsyncNotify?sessionId=xxxxxx"
GetMethod get = new GetMethod(url);
try {
   httpClient.executeMethod(get);
   //read the response
} catch(Exception e) {

}

Я думал о том, чтобы установить соединение на уровне сокета внутри цикла while и вызывать обработчик всякий раз, когда он получает некоторые данные, но есть ли лучший способ добиться этого?

РЕДАКТИРОВАТЬ:

Я использовал xSocket, чтобы перейти к следующему этапу, но соединение закрывается через 30 секунд:

         try {
            String _GETRequest = "/sample/notify";
            HttpClientConnection con = new HttpClientConnection("10.0.0.23", 5050);

            con.setConnectionTimeoutMillis(100000);
            GetRequest request = new GetRequest(_GETRequest);
            request.setParameter("id", id);

            IHttpResponseHandler responseHandler = new AsyncHandler();

            con.send(request, responseHandler);
            org.xlightweb.client.HttpClient httpClient = new org.xlightweb.client.HttpClient();
            request.setParameter("id", id);
            con.send(request, responseHandler);

                    // Don't let the program terminate. In other words,
                    // wait for a message from the server
            while(con.isOpen()) {};

            if(!con.isOpen()) {
            }

        } catch (ConnectException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

1 Ответ

1 голос
/ 25 июня 2010

Tomcat выпустил технологию под названием Tomcat Comet (http://tomcat.apache.org/tomcat-6.0-doc/aio.html). Он также использовался для новой спецификации Servlet 3.0. Эта технология позволит вам делать постоянные HTTP-соединения, через которые вы можете отправлять уведомления любым клиентам.

Существует также технология WebSockets, которая является частью HTML 5
(http://dev.w3.org/html5/websockets/) Конечно, пока это работает только в ограниченном наборе браузеров. Наверное, стоит подождать до этого.

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

Конечно, если все (клиенты и серверы) находятся в локальной сети, лучше всего подойдет RMI или даже EJB или JMS Pub / Sub.

Вот учебник по комете http://www.ibm.com/developerworks/web/library/wa-cometjava/index.html и еще один http://www.javaworld.com/javaworld/jw-03-2008/jw-03-asynchhttp-test.html

...