Skip to content

vanphuoc3012/chat-application

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Real Time Chat Application Using Spring Boot, WebSocket, RabbitMQ, Redis

Overview:

  • Oracle Database: store user information
  • Websocket: realtime tranfer message (See here)
  • RabbitMQ: STOMP broker, keep track of subscriptions and broadcasts messages to subscribed users. (Alternation for default in-memory STOMP broker of Spring) (See here)
  • Redis: in-memory database, use for store WebSocket Session, Chat Room information and messages. (See here)
  • Apache Zookeeper and Apache Kafka (use these tool for study purpose)
  • Apache Kafka: (See here)
  • Docker

Result

  • Chat Application with multiple room (multiple WebSocket channel):

    login.png img.png img_1.png

Kafka configuration

ProducerKafkaConfiguration.java ConsumerKafkaConfiguration.java

  • Dynamic create/delete topic, also change Consumer topic at runtime:
@Service
@Slf4j
public class KafkaService {
    @Autowired
    private AdminClient adminClient;
    
    @Autowired
    ConcurrentKafkaListenerContainerFactory<String, Message> listenerContainerFactory;
    
    @Autowired
    ConsumerFactory<String, Message> consumerFactory;
    
    ConcurrentMessageListenerContainer<String, Message> listenerContainer;
    public void changeTopic(String topic) throws InterruptedException {
        log.info("Changing topic to: {}", topic);
        if(listenerContainer != null) {
            listenerContainer.stop();
            Thread.sleep(2000);
            listenerContainer.destroy();
            Thread.sleep(2000);
        }
        ContainerProperties containerProperties = new ContainerProperties(topic);
        containerProperties.setGroupId(RandomStringUtils.randomAlphanumeric(3));
        containerProperties.setMessageListener((MessageListener<String, Message>) message -> {
            System.out.println("Kafka listener, topic: " + message.topic().toString() + ", message content: " + message.value().getContent());
        });
        listenerContainer = new ConcurrentMessageListenerContainer<>(consumerFactory, containerProperties);
        listenerContainer.start();
    }

    public void createTopic(String topic) {
        adminClient.createTopics(List.of(TopicBuilder.name(topic).build()));
    }

    public void deleteTopic(String topic) {
        adminClient.deleteTopics(List.of(topic));
    }
}

Run project using Docker

docker-compose.yml

docker compose up -d

img_5.png

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published