We are Borg
We are Borg

Reputation: 5311

Cometd with Spring-MVC for personalized chatting

I am working in a Spring-MVC application and I would like to include personalized chat as a feature in it. After some research I found out Cometd to be a suitable option. After going through the documentation and forever repeating samples, I have a little bit of setup which I have done. I need some help to integrate a personalized chat service in the spring-mvc app, and enabling private chat when user pushes chat button.

So basically, I found out, "/service/chat" can be used for private chat, so I have a class for that, and to use private chat, I must have a mapping of userid<-->sessionId, but I cannot find examples anywhere how to do it. I am posting some of the code I have, kindly let me know what is remaining to do, and if possible, some resources, samples for that.

Controller code:

@Controller
@Singleton
public class MessageController {

    private MessageService messageService;

    @Autowired(required = true)
    @Qualifier(value ="messageService")
    public void setMessageService(MessageService messageService){this.messageService=messageService;}

   @RequestMapping(value = "/startchatting", produces = "application/text")
   @ResponseBody
    public String startChattingService(){
    return "OK";
   }

    @RequestMapping(value = "/stopchatting",produces = "application/text")
    @ResponseBody
    public String stopChatting(){
        return "OK";
    }

}

Private Message Service :

@Service
public class PrivateMessageService {

    @Session
    private ServerSession session;

    @Listener("/service/private")
    public void handlePrivateMessage(ServerSession sender, ServerMessage message){

        String userId = (String) message.get("targetUserId");


        //Mapping code necessary to map userids to session-id's.
        //ServerSession recipient = findServerSessionFromUserId(userId);
        //recipient.deliver(session,message.getChannel(),message.getData(),null);

    }
}

CometConfigurer :

@Component
@Singleton
public class CometConfigurer {
    private BayeuxServer bayeuxServer;
    private ServerAnnotationProcessor processor;

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

    @PostConstruct
    public void init() {this.processor= new ServerAnnotationProcessor(bayeuxServer);}

    public Object postProcessBeforeInitialization(Object bean, String name) throws BeansException {
        System.out.println("Configuring service " + name);
        processor.processDependencies(bean);
        processor.processConfigurations(bean);
        processor.processCallbacks(bean);
        return bean;
    }

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

    public void postProcessBeforeDestruction(Object bean, String name) throws BeansException {
        processor.deprocessCallbacks(bean);
    }

    @Bean(initMethod = "start", destroyMethod = "stop")
    public BayeuxServer bayeuxServer() {
        BayeuxServerImpl bean = new BayeuxServerImpl();
      //  bean.setOption(BayeuxServerImpl.LOG_LEVEL, "3");
        return bean;
    }

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

Cometd beans :

   <beans:bean id="bayeuxServer" class="org.cometd.server.BayeuxServerImpl" init-method="start" destroy-method="stop"/>

I have directly included the JSP files which have cometd configuration and setup from https://github.com/fredang/cometd-spring-example, and modified them to serve my needs. Kindly let me know what else is remaining, all suggestions are welcome, I am unable to find any examples for same task on net, which are detailed, and have more code then explanation. Thank you.

Upvotes: 0

Views: 778

Answers (1)

Brian Clozel
Brian Clozel

Reputation: 59151

Using Spring 4.x's new WebSocket feature would definitely work; moreover, this new module ships with lots of very interesting features for your use case:

  • STOMP protocol support
  • messaging abstractions
  • session management
  • pub/sub mechanisms
  • etc

You can check this nice chat application that demonstrates all those features.

Upvotes: 1

Related Questions