spring+rabbitmq+stomp搭建websocket消息推送(非springbo…

Spring + RabbitMQ + Stomp 搭建 WebSocket 消息推送(非 Spring Boot 版本)

WebSocket 是一项在 Web 开发中非常重要的技术,它允许服务器和客户端之间实时、双向通信。在实际开发过程中,我们通常需要使用一些消息队列来实现后台消息推送系统,而 RabbitMQ 是一个非常优秀的消息队列实现。本文将介绍如何使用 Spring 和 RabbitMQ,以及使用 Stomp 协议来搭建 WebSocket 消息推送系统。

项目搭建

本项目使用的技术栈是 Spring + RabbitMQ + Stomp。为了测试这个应用,我们需要前端页面发送一个消息,然后后端通过 RabbitMQ 将消息传递给具有 WebSocket 连接的客户端。下面开始搭建这个应用。

创建项目

创建一个 Maven 项目,并在 pom.xml 文件中加入以下依赖:

<dependencies>
    <!-- Spring 相关依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring-framework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-messaging</artifactId>
        <version>${spring-framework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-websocket</artifactId>
        <version>${spring-framework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.amqp</groupId>
        <artifactId>spring-rabbit</artifactId>
        <version>${spring-amqp.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.amqp</groupId>
        <artifactId>spring-amqp-stomp</artifactId>
        <version>${spring-amqp.version}</version>
    </dependency>

    <!-- RabbitMQ 相关依赖 -->
    <dependency>
        <groupId>com.rabbitmq</groupId>
        <artifactId>amqp-client</artifactId>
        <version>${rabbitmq.version}</version>
    </dependency>

    <!-- Stomp JavaScript 客户端 -->
    <dependency>
        <groupId>org.webjars</groupId>
        <artifactId>stomp-websocket</artifactId>
        <version>${stomp-websocket.version}</version>
    </dependency>
</dependencies>

其中 ${spring-framework.version}${spring-amqp.version}${rabbitmq.version}${stomp-websocket.version} 定义了各种依赖的版本号,开发者可以使用自己项目需要的版本号来替换。

创建 RabbitMQ Exchange 和 Queue

在 RabbitMQ 中,Exchange 和 Queue 存储了实际传递的消息。在本应用中,我们需要创建一个 Exchange 和一个 Queue 用来存储消息。下面是代码:

@Configuration
public class RabbitMqConfig {

    public static final String EXCHANGE_NAME = "websocket-exchange";

    public static final String QUEUE_NAME = "websocket-queue";

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

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

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

配置 RabbitMQ

application.properties 文件中加入以下配置:

# RabbitMQ 配置
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host=/

创建 WebSocket Endpoint

在 Spring 中,我们需要创建一个 WebSocket Endpoint,通过它来处理客户端的请求。这个 Endpoint 需要处理 connect 和 disconnect Event,还需要处理来自客户端的消息。以下是相应的代码:

@Component
public class WebSocketEndpoint extends TextWebSocketHandler {

    private final RabbitTemplate rabbitTemplate;

    @Autowired
    public WebSocketEndpoint(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        System.out.println("WebSocket 连接已建立");
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        System.out.println("WebSocket 连接已关闭");
    }

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        String payload = message.getPayload();
        System.out.println("From client: " + payload);
    }
}

创建 RabbitMQ Consumer

在 RabbitMQ 中,我们需要为 Queue 建立一个 Consumer,以便在有新消息到达时可以处理它。以下是相应的代码:

@Component
public class RabbitMqConsumer implements MessageListener {

    private final SimpMessagingTemplate messagingTemplate;

    @Autowired
    public RabbitMqConsumer(SimpMessagingTemplate messagingTemplate) {
        this.messagingTemplate = messagingTemplate;
    }

    @Override
    public void onMessage(Message message) {
        String payload = new String(message.getBody());
        System.out.println("From RabbitMQ: " + payload);

        messagingTemplate.convertAndSend("/topic/greetings", payload);
    }
}

配置 WebSocket

WebSocketConfig.java 中定义了两个 Bean 对象:WebSocketHandlerMappingMessageBroker. WebSocketHandlerMapping 用来处理 WebSocket 请求,MessageBroker 用来将消息传递到 Broker 中。以下是相应的代码:

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Autowired
    private WebSocketEndpoint webSocketEndpoint;

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(webSocketEndpoint, "/websocket");
    }

    @Bean
    public WebSocketMessageBrokerConfigurer configureMessageBroker() {
        return new WebSocketMessageBrokerConfigurer() {

            @Override
            public void registerStompEndpoints(StompEndpointRegistry registry) {
                registry.addEndpoint("/stomp").withSockJS();
            }

            @Override
            public void configureMessageBroker(MessageBrokerRegistry registry) {
                registry.setApplicationDestinationPrefixes("/app");
                registry.enableStompBrokerRelay("/topic")
                        .setRelayHost("localhost")
                        .setRelayPort(61613)
                        .setClientLogin("guest")
                        .setClientPasscode("guest")
                        .setSystemLogin("guest")
                        .setSystemPasscode("guest");
            }
        };
    }
}

前端页面

下面是前端页面的代码,它使用 Stomp.js 客户端来和后端交互。

<!DOCTYPE html>
<html>
<head>
    <title>WebSocket</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script src="/webjars/stomp-websocket/stomp.min.js"></script>

    <script>
        var stompClient = null;

        function connect() {
            var socket = new SockJS('/stomp');
            stompClient = Stomp.over(socket);
            stompClient.connect({}, function(frame) {
                console.log('Connected: ' + frame);

                stompClient.subscribe('/topic/greetings', function (greeting) {
                    $('#greetings').append("<tr><td>" + JSON.parse(greeting.body).content + "</td></tr>");
                });
            });
        }

        function disconnect() {
            if (stompClient != null) {
                stompClient.disconnect();
            }
            console.log("Disconnected.");
        }

        function sendName() {
            stompClient.send("/app/hello", {}, JSON.stringify({'name': $("#name").val()}));
        }
    </script>
</head>

<body>
    <div>
        <input type="text" id="name" placeholder="Your name here">
        <button onclick="sendName()">Send</button>
    </div>
    <table>
        <thead>
            <tr>
                <th>Greetings</th>
            </tr>
        </thead>
        <tbody id="greetings">
        </tbody>
    </table>
    <div>
        <button onclick="connect()">Connect</button>
        <button onclick="disconnect()">Disconnect</button>
    </div>
</body>

</html>

测试

为了测试本应用,我们需要启动 RabbitMQ 服务器,并启动本应用。在 WebSocketEndpoint 中打开注释 rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_NAME, "test message");,然后在浏览器中访问 http://localhost:8080,点击“Connect”按钮,此时应该看到 WebSocket 连接已建立的输出信息。现在,再在 WebSocketEndpoint 中打开注释之前的代码段,然后点击“Send”按钮,再打开控制台,应该看到来自 RabbitMQ 的消息已经发送到了客户端。

结论

本文介绍了如何使用 Spring 和 RabbitMQ,以及使用 Stomp 协议来搭建 WebSocket 消息推送系统。通过这个应用,我们了解了如何使用 WebSocket、RabbitMQ 和 Stomp 来搭建一个实时应用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring+rabbitmq+stomp搭建websocket消息推送(非springbo… - Python技术站

(0)
上一篇 2023年3月28日
下一篇 2023年3月28日

相关文章

  • Win10怎么打开后缀.MSIX安装包?Win10系统Msixbundle后缀安装包文件使用教程

    Win10怎么打开后缀.MSIX安装包? MSIX是一种用于在Windows 10系统上安装应用程序的新型安装包格式。要打开后缀为.MSIX的安装包,可以按照以下步骤进行操作: 双击打开安装包:在Windows 10资源管理器中,找到后缀为.MSIX的安装包文件,然后双击打开它。系统会自动启动应用程序安装过程。 确认安装选项:在安装过程中,系统会显示应用程序…

    other 2023年8月5日
    00
  • OPPO账号如何注册、修改用户名、在其他手机登录?

    OPPO账号是使用OPPO手机的用户必须通过登录才能使用一些服务的账户。下面,我将详细讲解OPPO账号的注册、修改用户名、以及在其他手机上登录的攻略。 注册OPPO账号 打开OPPO手机,找到“设置”应用,并打开 在“设置”应用中找到“OPPO账号”选项,然后点击进行注册 填写账号信息(如手机号码、密码等),并进行验证 注册成功后,OPPO手机会自动登录,账…

    other 2023年6月27日
    00
  • concent渐进式重构react应用使用详解

    Concent渐进式重构React应用使用详解 Concent是一个专为React应用而生的状态管理框架,它提供了一种渐进式的重构方案,能够帮助我们将现有的React应用逐步地迁移到状态管理框架上,提高代码复用性和可维护性。下面详细讲解一下使用Concent进行渐进式重构React应用的攻略。 准备工作 在使用Concent进行渐进式重构React应用之前,…

    other 2023年6月27日
    00
  • 开始学nodejs——调试篇

    开始学Node.js——调试篇 在Node.js开发过程中,调试是非常重要的一环。本文将提供一个完整的攻略,介绍如何使用Node.js进行调试,并提供两个示例说明。 步骤1:安装调试器 在开始调试之前,需要安装调试器。Node.js提供了内置的调试器,可以使用以下命令安装: npm install -g node-inspector 步骤2:启动调试器 安装…

    other 2023年5月8日
    00
  • 页面调用单个swf文件,嵌套出多个方法。

    当页面需要调用单个SWF文件并嵌套出多个方法时,可以按照以下步骤进行操作: 准备SWF文件:首先,确保已经准备好一个包含多个方法的SWF文件。这个SWF文件可以使用Adobe Flash Professional或其他SWF编辑工具创建。 创建HTML页面:在你的项目文件夹中创建一个HTML文件,用于加载和调用SWF文件。可以使用任何文本编辑器创建一个新的H…

    other 2023年7月28日
    00
  • csapp深入理解计算机系统(第二版)第三章家庭作业答案

    csapp深入理解计算机系统(第二版)第三章家庭作业答案 在计算机系统中,机器语言是一种与机器硬件直接交互的低级语言。是计算机硬件指令集的实现方式之一。在《深入理解计算机系统》这本书中,第三章主要介绍了机器语言的相关内容,以及如何使用汇编语言编写基本的程序。为了帮助读者更好地理解和掌握这些概念,本文将针对该章的部分习题进行详细的解答。 第一道题 这道题要求我…

    其他 2023年3月28日
    00
  • idea多环境配置及问题解决方案

    IDEA多环境配置及问题解决方案 简介 IntelliJ IDEA是一款非常优秀的Java开发工具,它支持多种语言开发,包括Java、Kotlin、Scala、Groovy等,并且提供了强大的开发辅助和插件扩展功能。在日常工作中,我们需要经常在不同的开发环境中进行项目开发,本文将详细讲解如何在IDEA中进行多环境配置及问题解决方案。 多环境配置 配置开发环境…

    other 2023年6月25日
    00
  • 黑客之门的魅力:感染与加载(图)

    黑客之门的魅力:感染与加载 黑客之门是一款备受人们关注的游戏,其以黑客攻击为主题,玩家扮演黑客,通过使用各种技能来攻击目标系统。其中,感染与加载是黑客攻击常见的手段之一。本文将详细讲解黑客之门感染与加载的攻略,以帮助玩家更好地进行游戏。 什么是感染与加载 感染指黑客通过各种手段(如漏洞攻击、社会工程学等)将恶意代码植入目标系统中,以控制系统或获取敏感信息的过…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部