Skip to content

vanphuoc3012/chat-application

Folders and files

NameName
Last commit message
Last commit date

Latest commit

be413d1 · Mar 9, 2023

History

2 Commits
Mar 9, 2023
Mar 9, 2023
Mar 9, 2023
Mar 9, 2023
Mar 9, 2023
Mar 9, 2023
Mar 9, 2023
Mar 9, 2023
Mar 9, 2023
Mar 9, 2023
Mar 9, 2023

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