springboot集成webstock实战:服务端数据推送数据到客户端实现实时刷新

简介: 之前介绍过springboot集成webstock方式,具体参考:springboot集成websocket实战:站内消息实时推送

背景


   之前介绍过springboot集成webstock方式,具体参考:

springboot集成websocket实战:站内消息实时推送

这里补充另外一个使用webstock的场景,方便其他同学理解和使用,废话不多说了,直接开始!简单介绍一下业务场景:

   现在有一个投票活动,活动详情中会显示投票活动的参与人数、访问数、投票数。这三个投票数据需要实时的进行变化,这里就可以使用webstock进行返回页面。当三个数据发生变化时,服务端发送最新数据给客户端,客户端仅进行展示即可,不用轮询查询数据,页面也会显示动态效果。


实现步骤


1.配置webstock

@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

2.webstocket服务逻辑说明

   每个客户端进入活动之后需要与服务端建立一个连接,由于是在微信小程序中进行发布活动,所以使用用户的openID进行用户的唯一标识,每个链接就可以看做是客户端与服务端的一次会话session,使用clients将所有登录的用户创建的session存储起来,方便后期进行消息群发操作,用户退出时将创建session进行关闭操作。投票数、访问量、参与人数,每个指标变化时需要调用webstock服务器中的群发消息功能,这样就能保证三个数据变化之后客户端可以实时显示出最新的数据,达到最终预期的效果。

3.webstocket服务代码实现

@Component
@Slf4j
@Service
@ServerEndpoint("/ws/{openId}")
public class WebSocketServer {
    // 每个在线用户会创建一个WebSocketServer对象
    private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();
    // 存放所有在线的客户端 key为用户的唯一标识:userId,value为每个会话连接
    private static Map<String, Session> clients = new ConcurrentHashMap<>();
    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("openId") String openId) throws IOException {
        log.info("dataId:{},已建立连接",openId);
        clients.put(openId, session);
        webSocketSet.add(this);
    }
    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose(Session session,@PathParam("openId") String openId) {
        log.info("dataId:{},关闭连接",openId);
        clients.remove(openId);
        webSocketSet.remove(this);  //从set中删除
    }
    /**
     * @ Param session
     * @ Param error
     */
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("发生错误");
        error.printStackTrace();
    }
    /**
     * @Author: txm
     * @Description: 群发消息
     * @Param: []
     * @return: void
     * @Date:  2022/12/23 14:28
     **/
    public void batchSendMsg() throws IOException {
        VoteServiceImpl voteService = SpringUtils.getBean(VoteServiceImpl.class);
        // 此处是组装返回类似的参数信息:{"joinCount":15,"visitCount":169,"voteCount":36}
        String voteStatisticsVo = voteService.findVoteStatisticsVo();
        for (Map.Entry<String, Session> integerSessionEntry : clients.entrySet()) {
            integerSessionEntry.getValue().getBasicRemote().sendText(voteStatisticsVo);
        }
    }
}


4.业务逻辑触发说明

   这里仅以增加访问量操作为例进行说明(投票数增加、参与人数增加同理,只是业务触发逻辑不同),自定义了一个增加访问量的接口,前端调用该接口则活动的访问数量会进行加一处理,webstock服务群发消息的处理就需要在这里完成,参考代码如下:

@Service
@Slf4j
public class VoteServiceImpl implements VoteService {
  @Autowired
    private WebSocketServer webSocketServer;
public synchronized void updateVisitCount(Integer voteId) throws IOException {
        System.out.println("投票活动访问量增加操作");
        // 服务端群发消息,更新统计数据
        webSocketServer.batchSendMsg();
    }
    }

5.客户端测试地址:http://1json.com/network/ws.html,输入项目地址.

1b67c0b797f5e53091d860d13f7d724f_d98d22c92aa040a19416b195e8075fa1.png

   调用更新访问量接口之后,可以看到服务端已经将最新的投票统计信息进行了返回处理:

6750db32e58499b44d13a38150a5bdab_e5cfd672e2b94b3fbf1d2fedd42b67da.png

0196590e7150b20e7b6f0a0c0d3f3989_d3e09a182e9a45429528a4272abd907d.png


问题说明

   关于配置完成之后测试客户端不能建立连接问题

   当时在测试的时候也出现过不能建立连接,分析了一下原因是项目中使用了ssl证书配置,也就是项目本身访问的方式是https访问,所以不能使用ws协议进行访问,需要使用wss协议进行访问(两者的区别可以类比理解为http与https的区别),简单说一下项目配置,没有为了适配wss单独做配置(支持https访问的项目也会支持wss访问).

配置文件:

server:
  port: 8083
  servlet:
    session:
      timeout: PT30M
  ssl:
      enabled: true
      key-store: classpath:config/ssl/*****.com.pfx
      key-store-password: *****
      keyStoreType: *****


证书路径:

8f07a1f18e598fe9811ffe5d76626086_6de50b605e02442ea850b7754e125fd2.png

说一下本地以及测试环境的访问方式:

本地访问:

wss://127.0.0.1:8083/ws/1

服务器访问(使用ip访问不通,只能使用域名):

wss://域名:8083/ws/1

以上是使用webstock实现页面数据实时刷新的实现过程,如果看完感觉有所帮助欢迎评论区留言或点赞!


相关文章
|
2天前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
26 8
|
2月前
|
数据采集 前端开发 开发工具
Demo发布- ClkLog客户端集成-React Native
ClkLog是一款支持开源和商业付费的用户行为分析软件系统,通过采集客户端行为日志数据,在开源的OLAP数据库上进行模型分析。常见的客户端有Web JS、IOS、Andriod 、小程序等,以及react-native 、uni-app等。Clklog方案选用了\神策提供的开源SDK来进行数据采集。
121 48
|
1月前
|
XML Java API
Spring Boot集成MinIO
本文介绍了如何在Spring Boot项目中集成MinIO,一个高性能的分布式对象存储服务。主要步骤包括:引入MinIO依赖、配置MinIO属性、创建MinIO配置类和服务类、使用服务类实现文件上传和下载功能,以及运行应用进行测试。通过这些步骤,可以轻松地在项目中使用MinIO的对象存储功能。
|
2月前
|
消息中间件 Java Kafka
什么是Apache Kafka?如何将其与Spring Boot集成?
什么是Apache Kafka?如何将其与Spring Boot集成?
76 5
|
2月前
|
移动开发 小程序 开发工具
Demo发布- ClkLog客户端集成 uni-app
在上一期推文中,我们与大家分享了 React Native 的集成 demo。本期,我们将继续介绍 ClkLog 集成 uni-app 的 demo。 uni-app 允许开发者编写一套代码,然后可以编译到 iOS、Android、H5 以及各种小程序等多个平台。因此,本次 demo 中将涵盖上述所有平台,并且我们会详细说明集成过程中遇到的难点及解决方案。
|
2月前
|
消息中间件 Java Kafka
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
61 1
|
2月前
|
XML Java 数据库连接
SpringBoot集成Flowable:打造强大的工作流管理系统
在企业级应用开发中,工作流管理是一个核心组件,它能够帮助我们定义、执行和管理业务流程。Flowable是一个开源的工作流和业务流程管理(BPM)平台,它提供了强大的工作流引擎和建模工具。结合SpringBoot,我们可以快速构建一个高效、灵活的工作流管理系统。本文将探讨如何将Flowable集成到SpringBoot应用中,并展示其强大的功能。
398 1
|
2月前
|
消息中间件 监控 Java
您是否已集成 Spring Boot 与 ActiveMQ?
您是否已集成 Spring Boot 与 ActiveMQ?
61 0
|
2月前
|
JSON Java API
springboot集成ElasticSearch使用completion实现补全功能
springboot集成ElasticSearch使用completion实现补全功能
49 1
|
2月前
|
XML 存储 Java
SpringBoot集成Flowable:构建强大的工作流引擎
在企业级应用开发中,工作流管理是核心功能之一。Flowable是一个开源的工作流引擎,它提供了BPMN 2.0规范的实现,并且与SpringBoot框架完美集成。本文将探讨如何使用SpringBoot和Flowable构建一个强大的工作流引擎,并分享一些实践技巧。
234 0
下一篇
开通oss服务