一个websocket消息通知案例

在这里插入图片描述

1,pom
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>
2,WebSocketConfig.class

用户登录或进入需要保持通讯的模块时先请求这个"项目名/exportNotify",这样建立连接才能实时推送消息

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        //注册一个名字为"exportNotify" 的endpoint,并指定 SockJS协议。   点对点-用
        registry.addEndpoint("/exportNotify").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        //点对点式增加一个/queue 消息代理
        registry.enableSimpleBroker("/queue");
    }

}
3,消息查询的Controller

用户建立连接和收到服务器推送消息的回调,
比如这里,用户请求文件下载,任务执行了1分钟完成,后台通过
template.convertAndSendToUser 主动告知用户,用户收到消息会自动请求XX/message 刷新下载任务页面

    @ResponseBody
	@GetMapping("/message")
	public PageUtils list() {
		List<NotifyDO> list = notifyService.get(getUserId());
		PageUtils res = new PageUtils(list);
		return res;
	}
4,前端js
<script th:src="@{/js/plugins/chartJs/sockjs.min.js}"></script>
<script th:src="@{/js/plugins/chartJs/stomp.min.js}"></script>
<script th:src="@{/js/plugins/toastr/toastr.min.js}"></script>
    //exportNotify前必须要加项目根节点
    var sock = new SockJS("/witdbct/exportNotify");
    var stomp = Stomp.over(sock);
    //定义消息的显示样式
    toastr.options = {
        "positionClass": "toast-bottom-center",
        "timeOut": "2000", //展现时间
        "hideDuration": "1000"//消失的动画时间
    };
    ///queue前加user是为了向指定用户发送消息
    stomp.connect('guest', 'guest', function(frame) {
        stomp.subscribe("/user/queue/notifications",
            function handleNotification(message) {
                wrapper.notify();
                toastr.info(message.body);
        });
    });

用来接收消息的vue对象

var wrapper = new Vue({
    el: '#wrapper',
    data: {
        total: '',
        rows: '',
    },
    methods: {
        notify: function () {
            $.getJSON('/witdbct/notify/message', function (r) {
                wrapper.total = r.total;
                wrapper.rows = r.rows;
            });
        }
    },
    created: function () {
        this.notify()
    }
});

html

<div id="wrapper">
 <!--消息通知开始-->
    <div class="small-chat-box fadeInRight animated">
        <div class="heading" draggable="true">
                 系统消息
        </div>
        <div  id="version">
            <ul class="dropdown-messages" style="list-style: none;">
                <li v-for="row in rows" class="m-t-xs">
                    <div class="dropdown-messages-box">
                        <a class="pull-left" style="padding-right: 7px;">
                            <i class="fa fa-cloud-download fa-2x"></i>
                        </a>
                        <div class="media-body">
                            <small class="pull-right">{{row.before}}</small>
                            <strong>{{row.oper_table}}</strong><br/>
                            <small class="text-muted">{{row.crt_tm}}</small>
                        </div>
                    </div>
                    <div class="divider"></div>
                </li>
                <li>
                    <div class="text-center link-block" style="border-top: 1px solid #000;">
                        <a class="J_menuItem" href="#"> <i class="fa fa-envelope"></i> <strong> 查看所有消息</strong></a>
                    </div>
                </li>
            </ul>
        </div>
    </div>
    <div id="small-chat" draggable="true">
        <span class="badge badge-warning pull-right">{{total}}</span>
        <a class="open-small-chat">
            <i class="fa fa-envelope"></i>
        </a>
    </div>
    <!--消息通知结束-->
</div>
5,测试

消息通知是服务器主动向客户发送消息,可以使用另一个用户模拟后台下载任务完成给888888用户发送消息,不嫌麻烦可以写定时任务测试

    <button onclick="refMessage()">测试</button>
    function refMessage(){
        $.ajax({
            type: "GET",dataType: "STRING",
            url:"/witdbct/notify/test",
            async : false,
            success: function(){
                console.log("发送成功");
            }
        });
    }

实际运用是在异步处理任务完成要告知用户时调用

    @Autowired
	private SimpMessagingTemplate template;
	@ResponseBody
	@GetMapping("/test")
	public void list2() {
		UserDO aa =userService.getUserById("888888");
		template.convertAndSendToUser(aa.toString(), "/queue/notifications", "新消息:XXX报表下载任务完成");
	}
  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

占星安啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值