Skip to content

Latest commit

 

History

History
128 lines (97 loc) · 3.79 KB

README.md

File metadata and controls

128 lines (97 loc) · 3.79 KB

cometdchatservice

A Java microservice exposing cometd chat services

Example Usage

Imports

import com.looseboxes.cometd.chat.service.ChatConfig;
import com.looseboxes.cometd.chat.service.ChatSessionImpl;
import java.util.HashMap;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import org.cometd.bayeux.Message;
import org.cometd.client.BayeuxClient;
import org.cometd.client.transport.LongPollingTransport;
import org.eclipse.jetty.client.HttpClient;
import com.looseboxes.cometd.chat.service.Chat;
import com.looseboxes.cometd.chat.service.ChatListener;
import com.looseboxes.cometd.chat.service.ChatSession;

Declare some variables.

final String JOHN = "John";
final String MARY = "Mary";
final long timeout = 7_000;

To run this successfully, make sure the jetty server is started.

Create and set up Jetty's HttpClient (One for each user)

final HttpClient httpClient = new HttpClient();

// Here set up Jetty's HttpClient.
// httpClient.setMaxConnectionsPerDestination(2);
httpClient.start();

final LongPollingTransport tpt = new LongPollingTransport(new HashMap(), httpClient);

final String url = "http://localhost:8092/cometd";

final BayeuxClient johnClient = new BayeuxClient(url, tpt);

Use each client to create a chat session for each user

Use john's client to create johns chat session

final ChatConfig johnConfig = ChatConfig.builder()
        .logLevel(Chat.LOG_LEVEL_VALUES.DEBUG)
        .channel("/service/privatechat")
        .room("/chat/demo")
        .user(JOHN).build();

final ChatSession johnSession = new ChatSessionImpl(johnClient, johnConfig);

final Future<Message> johnJoin = johnSession.join();

final Message johnConnMsg = johnJoin.get(timeout, TimeUnit.MILLISECONDS);
System.out.println("ReadMe:: Response to " + JOHN + "'s join: "+johnConnMsg);

Use mary's client to create johns chat session

final ChatConfig maryConfig = johnConfig.forUser(MARY);

final ChatSession marySession = new ChatSessionImpl(maryClient, maryConfig);

final Future<Message> maryJoin = marySession.join();

final Message maryConnMsg = maryJoin.get(timeout, TimeUnit.MILLISECONDS);
System.out.println("ReadMe:: Response to " + MARY + "'s join: "+maryConnMsg);

Send messages back and forth

johnSession.send("Hi", MARY, (Message msg) -> {
    System.out.println("ReadMe:: Response to "+JOHN+"'s message sending: " + msg);
});

johnSession.send("Hi " + JOHN, JOHN, (Message msg) -> {
    System.out.println("ReadMe:: Response to "+MARY+"'s message sending: " + msg);
});

Make sure to leave when done

final Future<Message> johnLeave = johnSession.leave();

final Future<Message> maryLeave = marySession.leave();

johnLeave.get(timeout, TimeUnit.MILLISECONDS);

maryLeave.get(timeout, TimeUnit.MILLISECONDS);

Use of listener

// Add listeners to a chat session

johnSession.listeners().addListener(new ChatListener(){
    @Override
    public void onUnsubscribe(ChatListener.Event event) { }
    @Override
    public void onSubscribe(ChatListener.Event event) { }
    @Override
    public void onDisconnect(ChatListener.Event event) { }
    @Override
    public void onConnect(ChatListener.Event event) { }
});

Naming Conventions for Channels and Rooms

  • Chat rooms must start with /chat e.g /chat/soccer or /chat/customercare

  • Service rooms start with /service

  • For each chat room there is a corresponding service channel. E.g. For /chat/soccer the service would be /service/soccer

  • For each chat room there is a members channel on the server local session i.e

ServerSession.getLocalSession().getChannel(..) 

E.g. For /chat/soccer the members channel would be /members/soccer

  • Private chat configured at room /chat/privatechat