簡體   English   中英

Spring MVC:實現Cometd通道功能

[英]Spring MVC : Implementing Cometd channel functionality

  • 我正在開發一個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);
    }

}

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

任何有關如何創建頻道,訂閱和通過其發送消息的幫助都將是不錯的。 如果有人要聊天,請發表評論,我將為此創建一個聊天室。 非常感謝。 :-)

如果將“組”概念轉換為教程中的股票符號,則用例對我來說似乎是相同的(如果不是,則必須詳細說明問題)。

因此,通過查看本教程的示例3.2 ,您將看到如何將股票價格更新發送給所有對該特定股票有興趣的訂戶。

在您的情況下,本教程示例轉換為向特定組的所有成員發送消息,這正是您所要求的。

本教程包含有關如何創建,初始化通道以及如何使用它向訂戶發送消息的注釋的代碼。

嘗試一下該教程:構建,運行,研究它。 掌握了它的工作原理之后,您將看到您的示例是相似的,並且非常容易實現。

具備要運行的基本功能后,請考慮添加授權 這將使您可以微調哪些人可以將消息發布到哪個頻道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM