Spring MVC:实现Cometd频道功能

时间:2015-04-07 12:52:50

标签: java spring spring-mvc server-push cometd

  • 我正在开发一个我想要的Spring-MVC应用程序 实现Cometd提供的聊天功能。现在,在此 项目中,有各种组,每个组都有唯一ID(主键)。 每当创建一个组时,我想创建一个频道然后 当成员在组内发送消息时,消息就是 通过该频道发送,所以它只进入组成员。没有 需要持久化聊天消息,只需要消息 推送给所有在线人士。
    • 我选择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);
    }

}

ChatProducer:

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
   }
}

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

给教程一个:构建它,运行它,研究它。一旦掌握了它的工作原理,您就会发现您的示例相似且非常容易实现。

获得要运行的基本功能后,请考虑添加authorization。这样您就可以微调谁可以将消息发布到哪个频道。