GP Coder

Trang chia sẻ kiến thức lập trình Java

  • Java Core
    • Basic Java
    • OOP
    • Exception Handling
    • Multi-Thread
    • Java I/O
    • Networking
    • Reflection
    • Collection
    • Java 8
  • Design pattern
    • Creational Pattern
    • Structuaral Pattern
    • Behavior Pattern
  • Web Service
    • SOAP
    • REST
  • JPA
  • Java library
    • Report
    • Json
    • Unit Test
  • Message Queue
    • ActiveMQ
    • RabbitMQ
  • All
Trang chủ Message Queue Kết nối RabbitMQ sử dụng Web STOMP Plugin

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

Đăng vào 19/06/2020 . Được đăng bởi GP Coder . 6703 Lượt xem . Toàn màn hình

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.

Nội dung

  • 1 Web STOMP Plugin là gì?
  • 2 Sử dụng Web STOMP Plugin

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.

Để 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

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:

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:

  • https://www.rabbitmq.com/web-stomp.html
  • https://www.rabbitmq.com/stomp.html
  • https://www.rabbitmq.com/configure.html
  • http://jmesnil.net/stomp-websocket/doc/
4.9
16
Nếu bạn thấy hay thì hãy chia sẻ bài viết cho mọi người nhé! Và Donate tác giả

Shares

Chuyên mục: Message Queue Được gắn thẻ: Message Queue, RabbitMQ, Socket

Sử dụng publisher confirm trong RabbitMQ
Giới thiệu CloudAMQP – Một RabbitMQ server trên Cloud

Có thể bạn muốn xem:

  • Sử dụng publisher confirm trong RabbitMQ (16/06/2020)
  • Sử dụng Dead Letter Exchange trong RabbitMQ (13/06/2020)
  • Sử dụng Topic Exchange (Publish/Subscribe) trong RabbitMQ (01/06/2020)
  • Giới thiệu CloudAMQP – Một RabbitMQ server trên Cloud (02/10/2020)
  • Giới thiệu RabbitMQ (11/05/2020)

Bình luận

bình luận

Tìm kiếm

Bài viết mới

  • Clean code 13/01/2024
  • Giới thiệu CloudAMQP – Một RabbitMQ server trên Cloud 02/10/2020
  • Kết nối RabbitMQ sử dụng Web STOMP Plugin 19/06/2020
  • Sử dụng publisher confirm trong RabbitMQ 16/06/2020
  • Sử dụng Dead Letter Exchange trong RabbitMQ 13/06/2020

Xem nhiều

  • Hướng dẫn Java Design Pattern – Factory Method (98055 lượt xem)
  • Hướng dẫn Java Design Pattern – Singleton (97695 lượt xem)
  • Giới thiệu Design Patterns (87756 lượt xem)
  • Lập trình đa luồng trong Java (Java Multi-threading) (86426 lượt xem)
  • Giới thiệu về Stream API trong Java 8 (83828 lượt xem)

Nội dung bài viết

  • 1 Web STOMP Plugin là gì?
  • 2 Sử dụng Web STOMP Plugin

Lưu trữ

Thẻ đánh dấu

Annotation Authentication Basic Java Behavior Pattern Collection Creational Design Pattern Cấu trúc điều khiển Database Dependency Injection Design pattern Eclipse Exception Executor Service Google Guice Gson Hibernate How to Interceptor IO Jackson Java 8 Java Core JDBC JDK Jersey JMS JPA json JUnit JWT Message Queue Mockito Multithreading OOP PowerMockito RabbitMQ Reflection Report REST SOAP Structuaral Pattern Swagger Thread Pool Unit Test Webservice

Liên kết

  • Clean Code
  • JavaTpoint
  • Refactoring Guru
  • Source Making
  • TutorialsPoint
  • W3Schools Online Web Tutorials

Giới thiệu

GP Coder là trang web cá nhân, được thành lập với mục đích lưu trữ, chia sẽ kiến thức đã học và làm việc của tôi. Các bài viết trên trang này chủ yếu về ngôn ngữ Java và các công nghệ có liên quan đến Java như: Spring, JSF, Web Services, Unit Test, Hibernate, SQL, ...
Hi vọng góp được chút ít công sức cho sự phát triển cộng đồng Coder Việt.

Donate tác giả

Tìm kiếm các bài viết của GP Coder với Google Search

Liên hệ

Các bạn có thể liên hệ với tôi thông qua:
  • Trang liên hệ
  • Linkedin: gpcoder
  • Email: contact@gpcoder.com
  • Skype: ptgiang56it

Follow me

Copyright 2025 © GP Coder · All Rights Reserved · Giới thiệu · Chính sách · Điều khoản · Liên hệ ·

Share

Blogger
Delicious
Digg
Email
Facebook
Facebook messenger
Flipboard
Google
Hacker News
Line
LinkedIn
Mastodon
Mix
Odnoklassniki
PDF
Pinterest
Pocket
Print
Reddit
Renren
Short link
SMS
Skype
Telegram
Tumblr
Twitter
VKontakte
wechat
Weibo
WhatsApp
X
Xing
Yahoo! Mail

Copy short link

Copy link