Длинный опрос с Java и JBoss - PullRequest
       44

Длинный опрос с Java и JBoss

3 голосов
/ 21 октября 2010

Я ищу пример, как реализовать механизм longpoling в Java.Я хотел бы использовать EJB без состояния.

Я знаю, что что-то подобное будет работать:

@WebService(serviceName="mywebservice")
@Stateless
public class MyWebService {
    @WebMethod
    public String longPoll() {
         short ct = 0;
         while(someCondition == false && ct < 60) {
             sleep(1000);  // 1 sec
             ct++;
         }
         if (someCondition)
             return "got value";
         else
             return "";
    }
}

К сожалению, я знаю, что это не масштабируется.Могу ли я вернуться в веб-метод без завершения ответа и завершить его где-нибудь еще?

Ответы [ 2 ]

3 голосов
/ 21 октября 2010

JAX-WS обеспечивает поддержку вызова веб-служб с использованием асинхронного вызова клиента и поддерживает как функцию обратного вызова, так и модель опроса. Посмотрите на:

2 голосов
/ 21 октября 2010

То, что вы пытаетесь реализовать, называется server push .Каждый веб-сервер / сервер приложений имеет пул потоков, скажем, 10 потоков для обработки веб-запросов, если все эти потоки перейдут в «спящий режим», никакие другие веб-запросы не будут обслуживаться до тех пор, пока не возникнет один из этих «спящих».Некоторым решением является увеличение количества этих потоков, но тогда вы будете использовать больше памяти и больше ресурсов операционной системы (каждый поток стоит).Так что да, ваша реализация 'push server' не масштабируется.

Решения:

  • ваше веб-приложение может отправлять http-запрос каждые (скажем) 5 секунд, чтобы проверить,ваше 'someCondition' изменилось, а затем получило данные
  • AFAIK, Tomcat (так же и JBoss) уже имеет некоторый "соединитель" для поддержки таких запросов, поэтому Thread.sleep () или семафоры не понадобятся
  • использует новейший веб-сервер, реализующий Servlet API 3, он также поддерживает такие длительные HTTP-запросы
  • Подробнее: Онлайн-учебники по реализации комет (push-сервер)
...