如何让spring+cometd支持websocket?

Posted

技术标签:

【中文标题】如何让spring+cometd支持websocket?【英文标题】:How can I let spring+cometd support webscoket? 【发布时间】:2013-07-19 08:55:14 【问题描述】:

我使用 chrome,它总是返回:

WebSocket connection to 'ws://192.168.1.228:9090/achat/cometd' failed: Unexpected response code: 400

出现此错误后,它使用长轮询传输,并成功连接到服务器。

如何让 WebSocket 工作?它是由使用 SpringFramework 3.1 引起的吗?谢谢。

Web.xml

<!-- Filter to support cross domain requests -->
<filter>
    <filter-name>cross-origin</filter-name>
    <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
    <!--async-supported>true</async-supported-->
</filter>
<filter-mapping>
    <filter-name>cross-origin</filter-name>
    <url-pattern>/cometd/*</url-pattern>
</filter-mapping>
<!-- Cometd Servlet -->
<servlet>
    <servlet-name>cometd</servlet-name>
    <servlet-class>org.cometd.annotation.AnnotationCometdServlet</servlet-class>
    <!--async-supported>true</async-supported-->
    <init-param>
        <param-name>timeout</param-name>
        <param-value>20000</param-value>
    </init-param>
    <init-param>
        <param-name>interval</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>maxInterval</param-name>
        <param-value>10000</param-value>
    </init-param>
    <init-param>
        <param-name>maxLazyTimeout</param-name>
        <param-value>5000</param-value>
    </init-param>
    <init-param>
        <param-name>long-polling.multiSessionInterval</param-name>
        <param-value>2000</param-value>
    </init-param>
    <init-param>
        <param-name>logLevel</param-name>
        <param-value>100</param-value>
    </init-param>
    <init-param>
        <param-name>transports</param-name>
        <param-value>org.cometd.websocket.server.WebSocketTransport</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>cometd</servlet-name>
    <url-pattern>/cometd/*</url-pattern>
</servlet-mapping>

Servlet

@Named
@Singleton
@Service
public class ChatService 
    @Inject
    private BayeuxServer bayeux;
    @Session
    private ServerSession serverSession;

    @Listener("/chat")
    public void processHello(ServerSession remote, ServerMessage.Mutable message)
    
        Map<String, Object> input = message.getDataAsMap();
        String room = input.get("room").toString();
        String content = input.get("content").toString();

        Map<String, Object> output = input;        
        bayeux.getChannel("/room/" + room).publish(remote, output, null);
    

【问题讨论】:

【参考方案1】:

关注CometD Reference Manual,特别是解释如何集成CometD with Spring的部分。

您可以在此处找到使用 Spring 的 XML 配置设置 WebSocket 的示例,以及如何通过注释配置 Spring 的示例。

您的问题缺少 Spring 配置文件和 web.xml 文件的一部分,因此很难以更详细的方式帮助您。

请记住,如果您在 Spring 中配置 CometD,那么您必须从 web.xml 中删除所有 CometD 配置。您必须只有一个地方可以进行配置:web.xml 或 Spring 的 XML/注解。

【讨论】:

以上是关于如何让spring+cometd支持websocket?的主要内容,如果未能解决你的问题,请参考以下文章

提供多个端点的 Cometd 可能不会部署到同一路径 [/cometd]

如何将 GWT 连接到 CometD/Bayeux 事件?

OSGi、Jetty 和 CometD/Bayeux

cometd简单用例

如何启动 ajax 推送网站(activemq 或 cometd 或其他)?

Cometd vs ActiveMQ 用于实时 Web 应用程序的服务器端推送