在GraniteDS Gravity中使用websocket通道

时间:2013-05-12 18:40:39

标签: flex websocket messaging gravity graniteds

我正在使用GraniteDS Gravity进行消息传递服务。我的应用程序在使用数据轮询时工作正常,但是当我尝试使用websocket通道而不是数据轮询时,消息无法到达客户端。我还尝试修改Eclipse GraniteDS插件创建的示例Gravity聊天应用程序以使用websocket通道,但它也不起作用。

我正在使用Tomcat 7.0.39

为了更容易重现案例,我列出了我对Eclipse的GraniteDS插件创建的聊天应用程序所做的更改。

在web.xml中

1)修改过的servlet类:

旧:org.granite.gravity.servlet3.GravityAsyncServlet

新:org.granite.gravity.tomcat.TomcatWebSocketServlet

2)修改了servlet映射的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>

我没有更改flex客户端。 当我启动应用程序时,Tomcat会打印日志“Gravity successfully started”。但是生产者发送的消息并没有传达给消费者。

可能是什么问题?我在配置中遗漏了什么吗?

感谢。

1 个答案:

答案 0 :(得分:1)

经过4天的代码挣扎,我找到了问题的原因。 首先,我在客户端调试producer.send()消息时发现了错误消息。在尝试连接套接字

时抛出以下异常
"cannot connect to Web Socket server at 
 http://localhost:8080/gravityTest/websocketamf/amf
(IoError: Error #2031: Socket Error. URL: localhost)"

但抛出的异常没有达到顶级水平,所以我很长时间都无法了解异常。

在Google上搜索异常后,我发现它是由Flash安全策略引起的。然后我调试了PolicyFileServerListener,并在绑定后找出策略服务器的localAddress为[/0:0:0:0:0:0:0:0:843],因为它使用的是InetSocketAddressIPv6。我想这是JDK 1.7的默认行为。当我将JDK的版本更改为1.6时,localAddress变为[/0.0.0.0:843]。在此更改之后,我的应用程序成功访问了策略服务器,并且使用websocket进行的消息传递正常。