Я использую GraniteDS Gravity для службы обмена сообщениями. Мое приложение отлично работает при использовании опроса данных, однако, когда я пытаюсь использовать канал веб-сокета вместо опроса данных, сообщения не могли доходить до клиентов. Я также попытался изменить пример приложения Gravity chat, созданного плагином Eclipse GraniteDS, для работы с каналами websocket, но это тоже не сработало.

Я использую Tomcat 7.0.39

Чтобы упростить воспроизведение этого случая, я перечислил изменения, которые я внес в приложение чата, созданное плагином GraniteDS для Eclipse.

В web.xml

1) Модифицированный класс сервлета:

Старый: org.granite.gravity.servlet3.GravityAsyncServlet

Новое: org.granite.gravity.tomcat.TomcatWebSocketServlet

2) Модифицированный шаблон URL-адреса отображения сервлета

Старый: /gravityamf/*

Новое: /websocketamf/*

3) Добавлен прослушиватель политики flash:

<listener>
    <listener-class>org.granite.gravity.websocket.PolicyFileServerListener</listener-class>
</listener>

<context-param>
    <param-name>flashPolicyFileServer-allowDomains</param-name>
    <param-value>*:*</param-value>
</context-param>

В services-config.xml

1) Обновлено определение канала

Старый :

<channel-definition
    id="gravityamf"
    class="org.granite.gravity.channels.GravityChannel">
    <endpoint
        uri="http://{server.name}:{server.port}/{context.root}/gravityamf/amf"
        class="flex.messaging.endpoints.AMFEndpoint"/>
</channel-definition>

Новые:

<channel-definition 
    id="gravityamf"
    class="org.granite.gravity.channels.WebSocketChannel">
    <endpoint
        uri="http://{server.name}:{server.port}/{context.root}/websocketamf/amf"
        class="flex.messaging.endpoints.AMFEndpoint" />
</channel-definition>

Я не менял флекс-клиент. Когда я запустил приложение, Tomcat печатает журнал «Gravity успешно запущен». Но сообщения, отправленные производителем, не доходят до потребителя.

В чем может быть проблема? Мне что-то не хватает в конфигурации?

Спасибо.

1
erdem 12 Май 2013 в 22:40

1 ответ

Лучший ответ

После 4 дней борьбы с кодом я нашел причину проблемы. Сначала я обнаружил сообщение об ошибке при отладке сообщения Producer.send () на стороне клиента. При попытке подключения сокета возникает следующее исключение

"cannot connect to Web Socket server at 
 http://localhost:8080/gravityTest/websocketamf/amf
(IoError: Error #2031: Socket Error. URL: localhost)"

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

После поиска исключения я обнаружил, что оно вызвано политикой безопасности флеш-памяти. Затем я отладил PolicyFileServerListener и обнаружил, что localAddress сервера политики после привязки равен [/0:0:0:0:0:0:0:0:843], потому что он использует InetSocketAddressIPv6. Я предполагаю, что это поведение JDK 1.7 по умолчанию. Когда я меняю версию JDK на 1.6, localAddress становится [/0.0.0.0:843]. После этого изменения мое приложение успешно обратилось к серверу политик, и обмен сообщениями через веб-сокет работал нормально.

1
erdem 15 Май 2013 в 11:50