springboot整合websocket基础⼊门,常见注解使⽤Demo(基
于stomp协。。。
基于发布,订阅,主题模式,实现原理图
1 项⽬最终的结构图,源码⽰例下载
2 maven依赖,springboot 版本1.5.8.RELEASE,太⾼的版本会涉及到跨域问题,还在研究中
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId> </dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
<!-- httpClient相关依赖包begin -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.15</version>
websocket和socket</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.2.1</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId&lipse.jetty</groupId>
<artifactId>jetty-util</artifactId>
<version>9.3.7.v20160115</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.5</version>
<scope>test</scope>
</dependency>
<!-- httpClient相关依赖包end -->
3 核⼼类 WebSocketConfig 代码
package fig;
import t.annotation.Configuration;
import fig.MessageBrokerRegistry;
import org.springframework.fig.annotation.AbstractWebSocketMessageBrokerConfigurer; import org.springframework.fig.annotation.EnableWebSocketMessageBroker;
import org.springframework.fig.annotation.StompEndpointRegistry;
@Configuration
/**
* 开启WebSocket代理
* 也就是开启stomp协议来传输基于消息的broker消息
* 像rabbitmq的模式⼀样,有发布,订阅,主题的概念
*/
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
/**
* 注册端点,发布或者订阅消息的时候需要连接此端点,(客户端将通过这⾥配置的 URL 来建⽴ WebSocket 连接) */
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/endpoint-websocket")
//setAllowedOrigins ⾮必须,*表⽰允许其他域进⾏连接
.setAllowedOrigins("*")
//withSockJS 表⽰开始sockejs⽀持,可以解决浏览器对 WebSocket 的兼容性问题
.withSockJS();
}
/**
* 配置消息代理(中介)
* enableSimpleBroker 服务端推送给客户端的路径前缀
* setApplicationDestinationPrefixes 客户端发送数据给服务器端的⼀个前缀
*/
public void configureMessageBroker(MessageBrokerRegistry registry) {
/
**
* 设置消息代理前缀
* 即如果消息的前缀是 /topic ,就会将消息转发给消息代理(broker),
* 再由消息代理将消息⼴播给当前连接的客户端。
*
* 相当于rabbitmq⾥的主题
* 简单说,就是客户端js订阅的代码,要写成 stompClient.subscribe('/topic_1/shou_2')
* 服务端 @SendTo("/topic_1/shou_2")
*/
/**
* 表⽰配置⼀个或多个前缀,通过这些前缀过滤出需要被注解⽅法处理的消息。
* 例如,前缀为 /server_1 的 destination 可以通过@MessageMapping注解的⽅法处理,
* ⽽其他 destination (例如 /topic /queue)将被直接交给 broker 处理
*
* 简单说,客户端的js发送的代码要写成 stompClient.send("/server_1/fa_1")
* 就是 setApplicationDestinationPrefixes + @MessageMapping("/fa_1")
*/
registry.setApplicationDestinationPrefixes("/server_1", "/server_2");
}
}
4 Controller层 Controller_Test_1 代码编写
package ller;
import del.InMessage;
import del.OutMessage;
import cn.huawei.service.StockService;
import org.springframework.beans.factory.annotation.Autowired;
import ssaging.handler.annotation.MessageMapping;
import ssaging.handler.annotation.SendTo;
import ssaging.simp.SimpMessagingTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Controller;
import java.util.Iterator;
import java.util.Map;
@Controller
public class Controller_Test_1 {
/**
* 总结
* 1、SendTo 不通⽤,固定发送给指定的订阅者,只是⼊门演⽰下
* SimpMessagingTemplate 灵活,⽀持多种发送⽅式
*
* 2、@MessageMapping("/fa_1")
* 相当于 @RequestMapping,前台js代码 stompClient.send("/server_1/fa_1")
* 就是 setApplicationDestinationPrefixes + @MessageMapping("/fa_1")
*
* 3、vertAndSend("/topic_2/game_rank")
* 向订阅了 stompClient.subscribe('/topic_2/game_rank')的发送消息,此为前台js代码
*
*/
@Autowired
private SimpMessagingTemplate template;
/**
* 案例 1 最基本⼊门
*/
@MessageMapping("/fa_1")
@SendTo("/topic_1/shou_1")
public OutMessage gameInfo_1(InMessage message){
return new Content()+"---发1");
}
/**
* 案例 2
* SimpMessagingTemplate 基本使⽤ 1
*/
@MessageMapping("/fa_2")
public void gameInfo_3(InMessage message) throws InterruptedException {
for(int i=0; i<20; i++){
Thread.sleep(500L);
}
/**
* 案例 3
* SimpMessagingTemplate 基本使⽤ 2
*/
@MessageMapping("/single/chat")
public void gameInfo_4(InMessage message) throws InterruptedException {
new From()+" 发送:"+ Content()));
}
/**
* 案例 4
* 实时推送服务器的JVM负载,已⽤内存等消息
* 被注解@Scheduled(fixedRate 单位是毫秒) 标记的⽅法,是不能有参数,不然会报错
*/
@MessageMapping("/schedule/push")
@Scheduled(fixedRate = 30000)
public void sendServerInfo(){
int processors = Runtime().availableProcessors();
Long freeMem = Runtime().freeMemory();
Long maxMem = Runtime().maxMemory();
String message = String.format("服务器可⽤处理器:%s; 虚拟机空闲内容⼤⼩: %s; 最⼤内存⼤⼩: %s", processors,freeMem,maxMem );
}
/**
* 案例 5
* 演⽰调⽤快递接⼝获取数据,实时推送
* 这⾥不需要客户端向服务器发消息,所以没有 @MessageMapping
*/
@Scheduled(fixedRate = 30000)
public void sendGuPiaoInfo(){
Map<String, String> stockInfoMap = StockInfo();
Iterator<Map.Entry<String, String>> iterator = Set().iterator();
while (iterator.hasNext())
{
Map.Entry<String, String> next = ();
}
}
}
5 开始测试,共5个⼩Demo
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论