Мы хотим передавать данные с сервера клиентам, но можем использовать только HTTP (порт 80). Что является лучшим решением для обмена сообщениями? Одна из идей — Comet. Существуют ли другие идеи или фреймворки, которые предлагают, скажем, JMS через HTTP. (Да, ActiveMQ тоже его поддерживает, но ИМХО нечетко. И JXTA тоже поддерживает, но конфигурация сложная. Предпочтительнее что-то простое.)
Лучшее решение для Java HTTP push (обмен сообщениями)
Ответы (5)
Самым простым решением по многим причинам является использование подхода на основе Comet (как вы упоминаете). Это означает, что клиенты (которым вы хотите «отправлять» сообщения) открывают долгоживущие HTTP-соединения. Эти соединения остаются открытыми до тех пор, пока не истечет время ожидания или пока вы не отправите клиенту сообщение. Как только это происходит, клиент открывает новое соединение.
Прямое подключение к клиентам может быть проблематичным по многим причинам: они могут быть за брандмауэрами, которые это запрещают, они могут быть за прокси-серверами и так далее.
Если ваши клиенты не являются реальными серверами (в этом случае вы действительно являетесь клиентом), пусть они свяжутся с вами и отправят ответ на имитацию push.
Мы использовали COMET в сочетании с JMS, используя WAS Web 2.0 Feature Pack; фактически сервер подписался на JMS, а COMET отправил сообщение в браузер. как разработчик, он «чувствовал», что браузер подписывается на JMS. Это «просто сработало», поэтому мы не стали искать альтернативы.
Я мог бы представить реализацию JMS на чистом JavaScript в браузере, использующую HTTP в качестве транспорта, но мое мнение состоит в том, что это будет очень тяжеловесно. Я не знаю таких реализаций.
Альтернативный подход к уже обсуждавшимся (например, Comet и т. д.) заключается в реализации опроса в клиенте. Недостатком этого подхода является то, что у вас неизбежно возникает задержка с момента сообщения/события до момента, когда клиент его получит. Если ваше приложение очень чувствительно к таким задержкам, опрос отключен.
Если определенная задержка (минимум порядка нескольких секунд) приемлема, опрос в меньшей степени является злоупотреблением протоколом HTTP. Он также более устойчив к временным проблемам с сетью, поскольку сервер по умолчанию ставит сообщения в очередь и не расстраивается, если клиент недоступен по расписанию.
Я создал пример приложения с использованием Comet, Raphael, Bayeux, Java и Maven с PaaS Cloudbees и написал об этом сообщение в блоге, надеюсь, оно будет кому-то полезно.
http://geeks.aretotally.in/thinking-in-reverse-not-taking-orders-from-yo