Kết nối RabbitMQ sử dụng Web STOMP Plugin

Bài viết được sự cho phép của tác giả Giang Phan

Trong các bài viết trước mình đã giới thiệu với các bạn cách kết nối đến RabbitMQ sử dụng Java thông qua giao thức AMQP. Trong bài này, tôi sẽ giới thiệu với các bạn cách kết nối RabbitMQ sử dụng Javascript thông qua WebSocket.

  Giới thiệu CloudAMQP – Một RabbitMQ server trên Cloud
  Đôi chút về RabbitMQ

Web STOMP Plugin là gì?

Web STOMP plugin giúp chúng ta có thể sử dụng Javascript để kết nối đến RabbitMQ sử dụng giao thức STOMP thông qua WebSocket connection.

RabbitMQ Web STOMP sử dụng giao thức STOMP, được cung cấp bởi RabbitMQ STOMP plugin và expose (hiển thị) nó bằng WebSocket.

Để enable RabbitMQ Web STOMP plugin, sử dụng lênh sau:

rabbitmq-plugins enable rabbitmq_web_stomp

Sau khi enable, chúng ta có thể access một web socket endpoint tại context path: /ws

Chẳng hạn: http://127.0.0.1:15674/ws

Sử dụng Web STOMP Plugin

Trong ví dụ bên dưới, tôi sẽ tạo một ứng dụng Echo server, đơn giản cho phép user gửi một Message lên RabbitMQ server và subscribe để nhận Message từ RabbitMQ Server.

Giao diện chúng ta sẽ tạo như sau:

  • Box bên trái: hiển thị thông tin Message nhận được từ RabbitMQ server.
  • Box bên phải: hiển thị thông tin log message giao tiếp giữa client và RabbitMQ server thông qua websocket.
  • Một input cho phép user gửi message lên RabbitMQ server.

Kết nối RabbitMQ sử dụng Web STOMP Plugin

Để sử dụng STOMP trong Web browser context, chúng ta cần download một JavaScript STOMP library.

Link download: https://raw.github.com/jmesnil/stomp-websocket/master/lib/stomp.js

Đoạn code của chương trình như sau:

index.html

Kết nối RabbitMQ sử dụng Web STOMP Plugin

Tiếp theo, chúng ta sẽ tạo file javascript để kết nối đến RabbitMQ server, gửi và nhận message:

  • printLogDebug : hiển thị thông tin log message giao tiếp giữa client và RabbitMQ server thông qua websocket. Thông tin log sẽ được hiển thị ở box bên phải.
  • printReceivedMessage : hiển thị thông tin Message nhận được từ RabbitMQ server. Thông tin log sẽ được hiển thị ở box bên trái.
  • send : thực hiện gửi message lên RabbitMQ server.
  • subscribe: đăng ký nhận message từ RabbitMQ server.
  • bindSubmittingForm : bind sự kiện submit form (khi user nhấn enter), để lấy thông tin user đã nhập trong input và gửi Message lên RabbitMQ server.
  • onConnectCallback : phương thức này được gọi lại sau khi đã tạo Stomp Client thành công. Nó thực hiện bind sự kiện submit form, subscribe nhận message từ RabbitMQ server.
  • onErrorCallback : phương thức này được gọi lại khi tạo Stomp Client thất bại.
  • start : chạy ứng dụng, bao gồm tạo client, enable debug, tạo connection và đăng ký các callback.

Các bạn lưu ý rằng, Destination được định nghĩa trong STOMP có một chút khác biệt so với Java sử dụng AMQP. Đặc tả STOMP không quy định loại destination nào mà broker phải hỗ trợ, thay vào đó nó được xác định dựa vào giá trị của destination header trong SEND và MESSAGE. RabbitMQ STOMP hỗ trợ một số loại destination sau:

  • /exchange : SEND các khóa định tuyến tùy ý và SUBSCRIBE cho các pattern kết tùy ý.
  • /queue : SEND và SUBSCRIBE tới các hàng đợi được quản lý bởi STOMP gateway.
  • /amq/queue : SEND và SUBSCRIBE tới các hàng đợi được tạo bên ngoài STOMP gateway.
  • /topic : SEND và SUBSCRIBE tới transient và durable topic.
  • /temp-queue/ : tạo hàng đợi tạm thời (chỉ trong reply-to header).

Chi tiết các bạn tham khảo thêm tại: https://www.rabbitmq.com/stomp.html#d

rabbit-client.js

/**  * This is a RabbitMQ Web STOMP by gpcoder.com  * @see https://www.rabbitmq.com/web-stomp.html  */ // Create a destination with exchange type is topic and the routing key is gpcoder-stomp const DESTINATION = "/topic/gpcoder-stomp"; var client; var app = {     printLogDebug: function (message) {         let div = $('#logDebug');         div.append($("<code>").text(message));         div.scrollTop(div.scrollTop() + 10000);     },     printReceivedMessage: function (message) {         let div = $('#logReceivedMessage');         div.append($("<code>").text(message));         div.scrollTop(div.scrollTop() + 10000);     },     send: function(data) {         // destination, headers, body         client.send(DESTINATION, { "content-type": "text/plain" }, data);     },     subscribe: function() {         // destination, callback, headers         client.subscribe(DESTINATION, function (response) {             app.printReceivedMessage(response.body);         });     },     bindSubmittingForm: function() {         $('#first form').submit(function () {             let input = $('#first input');             let data = input.val();             app.send(data);             input.val('');             return false;         });     },     onConnectCallback: function () {         app.bindSubmittingForm();         app.subscribe();     },     onErrorCallback: function () {         console.log('error');     },     createRabbitClient: function() {         // Create STOMP client over websocket         return Stomp.client('ws://localhost:15674/ws');     },     start: function() {         // Create RabbitMQ client using STOMP over websocket         client = app.createRabbitClient(); // asign the created client as global for sending or subscribing messages                  // Enable debug         client.debug = app.printLogDebug;         // username, password, connectCallback, errorCallback, host         client.connect('guest', 'guest', app.onConnectCallback, app.onErrorCallback, '/');     } }; // Start application app.start();

Thêm một chút css cho page dễ nhìn hơn:

main.css

body {
    font-family: "Arial";
    color: #444;
}

h1, h2 {
    color: #39792e;
    font-weight: normal;
}

h1 {
    font-size: 1.5em;
    margin: 10px 20px;
}

h2 {
    font-size: 1.2em;
}

a {
    color: #39792e;
    border: 1px solid #fda;
    background: #fff0e0;
    border-radius: 3px; -moz-border-radius: 3px;
    padding: 2px;
    text-decoration: none;
    /* font-weight: bold; */
}

ul.menu {
    list-style-type: none;
    padding: 0;
    margin: 0;
}

ul.menu li {
    padding: 5px 0;
}

.box {
    width: 440px;
    float: left;
    margin: 0 20px 0 20px;
}

.box div, .box input {
    border: 1px solid;
    -moz-border-radius: 4px;
    border-radius: 4px;
    width: 100%;
    padding: 5px;
    margin: 3px 0 10px 0;
}

.box div {
    border-color: grey;
    height: 300px;
    overflow: auto;
}

div code {
    display: block;
}

#first div code {
    -moz-border-radius: 2px;
    border-radius: 2px;
    border: 1px solid #eee;
    margin-bottom: 5px;
}

#second div {
    font-size: 0.8em;
}

Bây giờ các bạn có thể chạy thử file index.html ở trên và kiểm tra kết quả.

Mở admin UI và xem thông tin Exchange, Queue được tạo:

Kết nối RabbitMQ sử dụng Web STOMP Plugin

Trên đây là một số hướng dẫn cơ bản về cách kết nối RabbitMQ server sử dụng Javascript thông qua WebSocket. Các bạn có thể tham khảo thêm cách Authentication user, cấu hình security, thay đổi host, port, … ở các liên kết bên dưới.

Tài liệu tham khảo:

Bài viết gốc được đăng tải tại gpcoder.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev