Spring MVC:实现 Cometd 通道功能

Posted

技术标签:

【中文标题】Spring MVC:实现 Cometd 通道功能【英文标题】:Spring MVC : Implementing Cometd channel functionality 【发布时间】:2015-04-07 12:52:50 【问题描述】: 我正在开发一个 Spring-MVC 应用程序,我想在其中 实现 Cometd 提供的聊天功能。现在,在这个 项目中,有各种组,每个组都有唯一 ID(主键)。 每当创建一个组时,我想创建一个频道,然后 当成员在组内发送消息时,该消息是 通过该通道发送,因此仅发送到 groupMembers。不 聊天消息的持久性是必需的,只是消息应该是 推送给所有在线的人。 我选择 Cometd 的主要动机是我读到有一个 很多文档和帮助,但正如我所见,几乎没有什么好的 网上的例子和项目网站上的文档是 被太多的技术细节所掩盖。我已经实施了一些 代码,但说实话,我不知道下一步该做什么,该去哪里 下一步。

这是我实现的一些代码,请看一下。

ChatService.java:

package com.journaldev.spring.chat;

import org.cometd.annotation.ServerAnnotationProcessor;
import org.cometd.bayeux.server.BayeuxServer;
import org.cometd.server.BayeuxServerImpl;
import org.springframework.beans.BeansException;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.servlet.ServletContext;

@Component
@Singleton
public class ChatService

    private BayeuxServer bayeuxServer;

    private ServerAnnotationProcessor serverAnnotationProcessor;

    @Inject
    public void setBayeuxServer(BayeuxServer bayeuxServer)
        this.bayeuxServer = bayeuxServer;
    

    @PostConstruct
    public void init()
        this.serverAnnotationProcessor = new ServerAnnotationProcessor(bayeuxServer);
    

    public Object postProcessBeforeInitialization(Object bean, String name) throws BeansException
        System.out.println("Configuring Service "+name);
        serverAnnotationProcessor.processDependencies(bean);
        serverAnnotationProcessor.processConfigurations(bean);
        serverAnnotationProcessor.processCallbacks(bean);
        return bean;
    

    public Object postProcessAfterInitialization(Object bean, String name) throws BeansException 
        return bean;
    

    public void postProcessBeforeDestruction(Object bean, String name) throws BeansException 
        serverAnnotationProcessor.deprocessCallbacks(bean);
    

    @Bean(initMethod = "start", destroyMethod = "stop")
    public BayeuxServer bayeuxServer() 
        // bean.setOption(BayeuxServerImpl.LOG, "3");

        return new BayeuxServerImpl();
    

    public void setServletContext(ServletContext servletContext) 
        servletContext.setAttribute(BayeuxServer.ATTRIBUTE, bayeuxServer);
    


聊天制作人:

public class ChatProducer 

    private ChatService chatService;

    public void setChatService(ChatService chatService)
        this.chatService = chatService;
    

   public synchronized void sendMessages(String messages)
          // Unfortunately I don't know where to send the messsages and how
   

任何关于如何创建频道、订阅和通过它们发送消息的帮助都会很好。如果有人想为此聊天,请发表评论,我会为此创建一个聊天室。非常感谢。 :-)

【问题讨论】:

CometD 文档包括 tutorials 用于像您这样的简单案例。你读过和研究过它们吗? @sbordet : 我有...不满足我正在寻找的用例。 【参考方案1】:

如果您将“组”概念转换为 tutorial 中的股票代码,则用例似乎与我相同(如果不是,那么您必须详细说明您的问题)。

因此,通过查看本教程的example 3.2,您将了解如何将股票价格更新发送给对特定股票的变化感兴趣的所有订阅者。

在您的情况下,教程示例转换为向特定组的所有成员发送消息,这是您所要求的。

本教程包含有关如何创建通道、初始化通道以及使用它向其订阅者发送消息的 cmets 代码。

试一试本教程:构建、运行、研究。一旦你掌握了它的工作原理,你就会发现你的例子很相似并且很容易实现。

拥有想要运行的基本功能后,请考虑添加authorization。这将允许您微调谁可以将消息发布到哪个频道。

【讨论】:

以上是关于Spring MVC:实现 Cometd 通道功能的主要内容,如果未能解决你的问题,请参考以下文章

如何让spring+cometd支持websocket?

CometD 长轮询 - 它是不是可以很好地适应高流量?

Spring MVC实现拦截器功能

Spring MVC+Spring+Mybatis实现支付宝支付功能(图文详解)

使用CometD技术实现web系统中的主动推送

Spring MVC框架设计及功能扩展