CometD 3 полностью переносим между контейнерами сервлетов, поэтому он будет работать как в Tomcat, так и в Jetty, по модулю ошибок в любом контейнере.
Библиотеки Jetty, от которых зависит CometD, также полностью переносимы (это просто служебные библиотеки). Точные зависимости зависят от того, какую функцию CometD вы хотите. Минимальный набор это:
jetty-util
jetty-util-ajax
Однако настоятельно рекомендуется использовать инструмент зависимостей, такой как Maven, и забыть о ручном удовлетворении зависимостей для вашего проекта.
CometD предоставляет учебник и tutorials, чтобы вы могли начать.
Стандарт JSR 356 WebSocket предоставляет способ отправки сообщений WebSocket с помощью асинхронные API.
В то время как реализация Jetty JSR 356 позволяет одновременно использовать эти API, реализация Tomcat не позволяет. Поскольку параллельное использование этих API-интерфейсов распространено в CometD, оказалось, что CometD нормально работает в Jetty, но не в Tomcat. Поэтому CometD был изменен, чтобы избежать одновременных операций записи ради переносимости между контейнерами, поскольку спецификация JSR 356 была слишком расплывчатой в отношении точной семантики API.
ОБНОВЛЕНИЕ. Существует два способа одновременного использования API-интерфейсов WebSocket.
Во-первых, реализация WebSocket заботится о параллелизме; такие приложения, как CometD, могут одновременно вызывать API-интерфейсы WebSocket, а внутри реализация имеет synchronized
блоков, или очередь, или любое другое решение, применяемое для обеспечения того, чтобы сообщения не были повреждены. Два потока смогут одновременно вызывать API-интерфейсы WebSocket, но в конечном итоге обработка сообщений будет сериализована, и сообщения будут отправляться одно за другим.
Во-вторых, приложение (CometD) позаботится о параллелизме и применит synchronized
блоков или постановку в очередь и т. д. перед вызовом API-интерфейсов WebSocket.
Jetty реализовал первое решение, Tomcat — нет. Из-за этого CometD был модифицирован для реализации второго решения.
Это означает, что вы можете использовать API CometD одновременно (что в конечном итоге приведет к вызову API WebSocket), не беспокоясь, потому что CometD должным образом заботится о параллелизме, чтобы быть переносимым между контейнерами сервлетов и их реализациями WebSocket.
Асинхронные записи WebSocket не имеют ничего общего с <async-supported>
в web.xml
, которые вы все равно должны были включить, как указано в документация.
person
sbordet
schedule
16.04.2015