Giap Hiep

I'm Giap Hiep

I'm a web developer, a gymer. I enjoy share something i know that help people's work!
Giap Hiep

RabbitMQ Với Spring boot

1. Mở đầu

Trong bài viết này tôi sẽ không giới thiệu về RabbitMQ và tập trung trình bày về set up một RabbitMQ Broker sử dụng spring boot nếu bạn muốn tìm hiểu khái niệm về RabbitMQ thì có thể đọc tại đây https://kipalog.com/posts/Tim-hieu-RabbitMQ---Phan-1

2. Setup một Rabbitmq Broker

Cách đơn giản nhất là sử dụng docker và run RabbitMQ image :
docker run -d -p 5672:5672 -p 15672:15672 --name my-rabbit rabbitmq:3.7-management

Sau khi mà bạn run câu lệnh này thành công thì bạn có thể check bằng cách
http://localhost:15672

login: username: guest password:guest

Như vậy là chúng ta đã Setup thành công một Rabbitmq Broker sau đây chuhgs ta sẽ tiến hành cấu hình connect đến Rabbitmq từ một ứng dụng spring boot .

3. Cấu hình ứng dụng spring boot


String QUEUE_NAME = "queue_name";

String EXCHANGE_NAME = "exchange_name";

String ROUTING_KEY = "rabbitmq.*";

Chúng ra cấu hình Receive

@Configuration
public class ConfigReceive {

    @Bean
    Queue queue() {
        return new Queue(QUEUE_NAME, false);
    }

    @Bean
    TopicExchange exchange() {
        return new TopicExchange(EXCHANGE_NAME);
    }

    @Bean
    Binding binding(Queue queue, TopicExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY);
    }
}

Đoạn code này có ý nghĩa là chúng ta sẽ tạo ra một queue có tên là queue_name , một topic exchange tên là exchange_name
và sẽ queue này sẽ được đăng kí nhận message từ exhange này qua ROUTING có partern rabbitmq.*

Cấu hình Listener:

@Configuration
public class ConfigListener {
    @Bean
    SimpleMessageListenerContainer container(ConnectionFactory connectionFactory,
                                             MessageListenerAdapter listenerAdapter) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.setQueueNames(QUEUE_NAME);
        container.setMessageListener(listenerAdapter);
        return container;
    }

    @Bean
    MessageListenerAdapter listenerAdapter(MessageListener receiver) {
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }
}

Dưới đây là cấu hình nhận message từ queue name

Tiếp theo chúng ra sẽ viết controller để testing

@RestController
@RequestMapping("/messages")
public class MessageController {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @PostMapping("/send")
    public void sendMessage(@RequestBody MessageDto messageDto) {
        rabbitTemplate.convertAndSend(EXCHANGE_NAME, ROUTING_KEY, messageDto.getMessageText());
    }
}

Chúng ta gửi lên một message và send nó đến exchange tên là exchange_name và sẽ gửi đến tất cả các queue mà đã đăng kí (bind) đến exchange với ROUTING = rabbitmq.* . Trong ví dụ trên tôi chỉ tao một queue đăng kí exchange này nhưng bạn hoàn toàn có thể tạo nhiều queue để đăng kí 1 exchange
Sau khi run ứng dụng ta check RabbitMQ Management

Chúng ta để ý vào Exchange có tên exchange_name đã được tạo và Queue có tên queue_name

4. Test bằng postman

curl --location --request POST 'localhost:8080/messages/send' \
--header 'Content-Type: application/json' \
--data-raw '{
	"id" : "1",
	"messageText": "hello word"
}'

Chúng ta kiểm tra log thì thấy đã có log Message Received : hello world

Vậy là Listener đã lắng nghe được khi mà message được push đến queue được đăng kí

5. Kết luận

Oke vậy là đã xong hẹn các bạn trong bài viết tiếp theo .