Какова конфигурация java/scala, необходимая для интеграции Atmosphere (версия 1.0.13)?

Я уверен, что это что-то довольно простое, но я не могу вспомнить, как сталкивается библиотека, которая имеет больше расхождений между ее документами, API и версиями. (Хотя, честно говоря, я уверен, что они существуют!) Насколько я могу судить по ресурсам, которые я просматривал, я думаю, что это довольно близко к "текущему", но я получаю сообщение об ошибке (карты No AtmosphereHandler запрос /path/to/service/point), и вам нужно небольшое руководство относительно того, что я должен попробовать дальше.

Я могу повторно опубликовать подробный вариант, но вкратце...

1) web.xml имеет эту запись сервлета (из последней версии git chat):

<servlet>
 <description>AtmosphereServlet</description>
 <servlet-name>AtmosphereServlet</servlet-name>
 <servlet-class>org.atmosphere.cpr.AtmosphereServlet</servlet-class>
 <async-supported>true</async-supported>
 <init-param>
 <param-name>org.atmosphere.cpr.Broadcaster.supportOutOfOrderBroadcast</param-name>
 <param-value>false</param-value>
 </init-param>
 <!--<init-param>-->
 <!--<param-name>org.atmosphere.cpr.broadcasterClass</param-name>-->
 <!--<param-value>org.atmosphere.util.SimpleBroadcaster</param-value>-->
 <!--</init-param>-->
 <load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
 <servlet-name>AtmosphereServlet</servlet-name>
 <url-pattern>/path/to/service/point</url-pattern>
</servlet-mapping>

2) веб-приложение имеет это определение класса (в Scala):

@AtmosphereHandlerService(path = "/path/to/service/point")
class MyCustomAtmoHandler extends AtmosphereHandler with Logging with OtherStuff {
 override def onRequest {...}
 override def onStateChange {...}
 override def destroy {...}

Примечание: документ, который я использовал в качестве руководства, не содержал параметр аннотации "путь", который я должен был добавить, чтобы его компилировать.

EDIT: используется версия Jetty 9.0.4.v20130625

1 ответ

Отвечая на мои собственные вопросы (в случае, если какая-то другая блуждающая единственная фигура окажется в том же положении), я должен был решить две проблемы:

1) отмените аннотацию AtmosphereHandlerService или, по крайней мере, параметр "путь". (Возможно, можно использовать аннотацию, используя остальные параметры, не уверен.)

2) добавьте файл с именем atmosphere.xml в папку META-INF, которая содержит что-то вроде:

<atmosphere-handlers>
 <atmosphere-handler support-session="false" context-root="/websocket/path/to/processorA" class-name="com.some.className">
 </atmosphere-handler>

 <atmosphere-handler support-session="true" context-root="/websocket/optional/path/to/processorB" class-name="com.some.other.className">
 </atmosphere-handler>
</atmosphere-handlers>

Итак... web.xml (или любой другой файл/архитектура развертывания, используемый вашим контейнером сервлетов) создает "общий" контекстный путь для всех обработчиков ALL, тогда как определенные маршруты привязаны к каждому отдельному обработчику, используя разметку atmosphere.xml. (Что-то вроде "/websocket/*" должно разрешить маршрутизацию обоих этих гипотетических обработчиков.

Вероятно, есть более эффективные способы изложения этого решения с технической точки зрения, но, надеюсь, это краткое описание непрофессионала указывает вам в правильном направлении.

licensed under cc by-sa 3.0 with attribution.