package com.yb.msgpush.service;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import org.springframework.stereotype.Component;
@ServerEndpoint("/websocket/{sid}")
@Component
public class WebSocketServer {
//static Log log=LogFactory.get(WebSocketServer.class);
//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
private static int onlineCount = 0;
//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();
//与某个客户端的连接会话,需要通过它来给客户端发送数据
private Session session;
//接收sid
private String sid="";
/**
* 连接建立成功调用的方法*/
@OnOpen
public void onOpen(Session session,@PathParam("sid") String sid) {
this.session = session;
webSocketSet.add(this); //加入set中
addOnlineCount(); //在线数加1
System.out.println("有新窗口开始监听:"+sid+",当前在线人数为" + getOnlineCount());
this.sid=sid;
/* try {
sendMessage("");
} catch (IOException e) {
e.printStackTrace();
}*/
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose() {
webSocketSet.remove(this); //从set中删除
subOnlineCount(); //在线数减1
System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());
}
/**
* 收到客户端消息后调用的方法
*
* @param message 客户端发送过来的消息*/
@OnMessage
public void onMessage(String message, Session session) {
System.out.println("收到来自窗口"+sid+"的信息:"+message);
//群发消息
for (WebSocketServer item : webSocketSet) {
try {
item.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
*
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
//log.error("发生错误");
error.printStackTrace();
}
/**
* 实现服务器主动推送
*/
public void sendMessage(String message) throws IOException {
this.session.getBasicRemote().sendText(message);
}
/**
* 群发自定义消息
* */
public static void sendInfo(String message,@PathParam("sid") String sid) throws IOException {
//log.info("推送消息到窗口"+sid+",推送内容:"+message);
for (WebSocketServer item : webSocketSet) {
try {
//这里可以设定只推送给这个sid的,为null则全部推送
if(sid==null) {
item.sendMessage(message);
}else if(item.sid.contains(sid)){
item.sendMessage(message);
}
} catch (IOException e) {
continue;
}
}
}
public static synchronized int getOnlineCount() {
return onlineCount;
}
public static synchronized void addOnlineCount() {
WebSocketServer.onlineCount++;
}
public static synchronized void subOnlineCount() {
WebSocketServer.onlineCount--;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
SpringBoot+WebSocket+RabbitMQ实时消息推送
共387个文件
js:130个
css:95个
less:57个
1星 需积分: 44 105 下载量 66 浏览量
2020-01-20
14:27:36
上传
评论 7
收藏 3.93MB ZIP 举报
温馨提示
rabbitmq+websocket(SpringBoot版)实现分布式消息推送 本来想用websocket做一个消息推送 可是分布式环境下不支持session共享因为服务器不同 所以采用 rabbitMQ+webSocket实现分布式消息推送 生产者将消息 发送给 rabbitMQ 的 virtual-host:/(顶极路由) 再由它路由到交换机 最终由交换机通过路由键指定具体的管道 消费者监听指定的管道获取消息 最终将获取的消息 交给 webSocket 被@OnMessage注解标识的方法 每次消费一条消息交给 被@OnMessage注解标识的方法 返回给前台 实现分布式实时推送
资源推荐
资源详情
资源评论
收起资源包目录
SpringBoot+WebSocket+RabbitMQ实时消息推送 (387个子文件)
semantic.ui.min.css 635KB
bootstrap.min.css 118KB
style.css 83KB
unix.css 54KB
font-awesome.min.css 38KB
jsgrid-theme.min.css 34KB
fullcalendar.css 30KB
weather-icons.css 30KB
mmc-chat.css 28KB
sweetalert.css 23KB
themify-icons.css 17KB
jquery-ui.min.css 16KB
sidebar.css 16KB
pignose.calendar.min.css 14KB
barRating.css 14KB
dataTables.bootstrap.min.css 13KB
lobipanel.min.css 12KB
chartist.min.css 11KB
style.css 8KB
buttons.dataTables.min.css 8KB
buttons.bootstrap.min.css 8KB
normalize.css 8KB
compose-email.css 8KB
toastr.min.css 7KB
ui-widget-v1.css 6KB
responsive.css 6KB
widget-stat.css 6KB
global.css 5KB
chat.css 4KB
header.css 4KB
nestable.css 4KB
forms.css 4KB
invoice-edit.css 4KB
scrollable.min.css 3KB
ion.rangeSlider.css 3KB
owl.carousel.min.css 3KB
ion.rangeSlider.skinHTML5.css 3KB
button.css 3KB
data-table.css 3KB
invoice.css 2KB
tab.css 2KB
ion.rangeSlider.skinModern.css 2KB
preloader.css 2KB
ion.rangeSlider.skinFlat.css 2KB
todo-list.css 2KB
timeline.css 2KB
ion.rangeSlider.skinSimple.css 2KB
ion.rangeSlider.skinNice.css 2KB
vertical-carousel.css 2KB
viewsource.css 2KB
profile.css 2KB
calendar.css 2KB
profile-widget.css 2KB
jsgrid.min.css 2KB
menu-upload.css 2KB
search.css 2KB
card.css 2KB
panel.css 1KB
table.css 1KB
chartist.css 1KB
login.css 1KB
fonts.css 1KB
ui-element-basic.css 1KB
owl.theme.default.min.css 1003B
favourite_menu.css 906B
recent-comments.css 860B
products_1.css 853B
advance-widget.css 824B
jqvmap.min.css 809B
products_2.css 793B
carousel.css 754B
scrollable.css 738B
flot-chart.css 717B
recent-message.css 716B
morris-chart.css 677B
badge.css 658B
weather.css 615B
order-list.css 606B
chart.css 605B
progress-bar.css 576B
order-progress.css 564B
products_3.css 553B
knob.css 506B
social-media-stats.css 502B
booking-system.css 443B
modal.css 429B
datamap.css 406B
jquery.lineProgressbar.css 374B
table-export.css 324B
pace.css 319B
nestable.css 267B
mixins.css 261B
vector-map.css 216B
gmap.css 215B
variable.css 174B
Thumbs.db 15KB
fontawesome-webfont.eot 162KB
weathericons-regular-webfont.eot 97KB
themify.eot 77KB
themify.eot 77KB
共 387 条
- 1
- 2
- 3
- 4
资源评论
- pr.2020-06-01别下载,辣鸡的很,跑都跑不起来,真敢放上去,
- 九九酱2021-08-12哎呀这个连个pom都没有
- TMobkey2020-07-08我下载了不能用 博主可以写的详细些 出个教程 我是真菜鸟 不会操作 导入跑不起来
whboy_xlz
- 粉丝: 1
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于jsp+mysql的JSP个人日记本源码.zip
- 基于jsp+mysql+servlet的JSP图书馆图书管理系统源码.zip
- 【2024win11软件启动速度反应慢解决方法附工具】
- 3.1_将字符串颠倒输出 .cpp
- 基于MATLAB实现的数字信号处理课后仿真代码,共十四章
- mysql-8.0(windows+mac版本).zip
- Screenshot_2024-05-14-17-26-40-479_com.tencent.mobileqq.jpg
- 749783406737663csgk_schedule.zip
- 基于html+css+js(jquery)开发的网易云商城+源码+音乐+商品详情+商城界面+商城购物车+网易云首页(高分优秀项目
- 信息论课程设计基于Python实现的霍夫曼、费诺、香农编码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功