springboot websocket rabbitmq
时间: 2025-01-19 16:51:45 浏览: 42
### Spring Boot 整合 WebSocket 和 RabbitMQ 实现消息通信
#### 依赖配置
要在 `pom.xml` 文件中引入必要的依赖项,以便支持 WebSocket 和 RabbitMQ 功能:
```xml
<dependencies>
<!-- Spring Boot Starter Websocket -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<!-- Spring Boot Starter AMQP for RabbitMQ support -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!-- Other dependencies... -->
</dependencies>
```
上述代码展示了如何在 Maven 构建文件里声明所需的库[^1]。
#### 配置类设置
创建一个用于配置 WebSocket 及其与 RabbitMQ 协同工作的 Java 类。此部分涉及到了 STOMP 路由器以及消息代理的初始化工作。
```java
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
// 使用RabbitMQ作为消息代理服务器
config.enableStompBrokerRelay("/topic", "/queue")
.setRelayHost("localhost")
.setRelayPort(61613);
// 设置应用内消息前缀
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
// 注册STOMP端点并启用SockJS协议的支持
registry.addEndpoint("/ws").withSockJS();
}
}
```
这段代码片段说明了怎样通过编程方式指定哪些 URL 将会成为 WebSocket 的入口,并指定了应用程序内部的消息路径和外部代理之间的映射关系[^3]。
#### 发送消息服务
定义了一个名为 `MessageService` 的组件负责向队列发送信息,在这个例子中假设有一个自定义的主题交换机叫做 `"socket.msg.push"` 来接收这些消息。
```java
@Service
public class MessageService {
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* 向特定主题发布一条新消息.
*/
public void sendToQueue(String messageContent) {
rabbitTemplate.convertAndSend("socket.msg.push", new Message(messageContent));
}
static class Message{
String content;
public Message(String c){
this.content=c;
}
}
}
```
以上实现了将业务逻辑层产生的事件转化为可传输的数据包并通过 RabbitMQ 推送给所有已订阅相应频道的客户端[^4]。
#### 控制器编写
最后一步是在控制器层面暴露 RESTful API 或者其他形式的服务接口供前端调用触发消息推送行为。
```java
@RestController
@RequestMapping("/api/messages")
public class MessageController {
@Autowired
private MessageService messageService;
@PostMapping("")
ResponseEntity<?> sendMessage(@RequestBody Map<String, Object> payload) {
String msgText = (String)payload.getOrDefault("text","default text");
try {
messageService.sendToQueue(msgText);
return ResponseEntity.ok().build();
} catch(Exception e){
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
}
}
}
```
这样就完成了一次从 HTTP 请求到 WebSocket 广播整个流程的设计。
阅读全文
相关推荐


















