news 2026/5/8 23:11:11

苍穹外卖项目中的Spring Task和WebSocket实现详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
苍穹外卖项目中的Spring Task和WebSocket实现详解
📚 目录(点击跳转对应章节)

一、Spring Task定时任务实现
二、WebSocket实现实时通信
三、实际应用场景
总结


在现代Web应用开发中,定时任务和实时通信是两个非常重要的功能。本文将深入探讨苍穹外卖项目中如何使用Spring Task实现定时任务以及如何通过WebSocket实现前后端实时通信。

一、Spring Task定时任务实现

1.1 配置启用定时任务

在Spring Boot中使用定时任务非常简单,只需要在主启动类上添加@EnableScheduling注解即可启用定时任务功能。

@SpringBootApplication@EnableScheduling//开启定时任务功能publicclassSkyApplication{publicstaticvoidmain(String[]args){SpringApplication.run(SkyApplication.class,args);log.info("server started");}}

1.2 定时任务实现

在苍穹外卖项目中,所有定时任务都被封装在OrderTask类中,该类使用@Component注解标记为Spring组件。

处理超时未支付订单
/** * 处理支付超时订单 */@Scheduled(cron="0 * * * * ?")//每分钟执行一次publicvoidprocessTimeoutOrder(){log.info("处理支付超时订单:{}",newDate());LocalDateTimetime=LocalDateTime.now().plusMinutes(-15);// select * from orders where status = 1 and order_time < 当前时间-15分钟List<Orders>ordersList=orderMapper.getByStatusAndOrdertimeLT(Orders.PENDING_PAYMENT,time);if(ordersList!=null&&!ordersList.isEmpty()){ordersList.forEach(order->{order.setStatus(Orders.CANCELLED);order.setCancelReason(MessageConstant.PAYMENT_TIMEOUT);order.setCancelTime(LocalDateTime.now());orderMapper.update(order);});}}

这个任务每分钟执行一次,查找超过15分钟仍未支付的订单,并将其状态更新为已取消。

处理"派送中"状态的订单
/** * 处理"派送中"状态的订单 */@Scheduled(cron="0 0 1 * * ?")//每日凌晨1点执行一次publicvoidprocessDeliveryOrder(){log.info("处理派送中订单:{}",newDate());// select * from orders where status = 4 and order_time < 当前时间-1小时LocalDateTimetime=LocalDateTime.now().plusHours(-1);List<Orders>ordersList=orderMapper.getByStatusAndOrdertimeLT(Orders.DELIVERY_IN_PROGRESS,time);if(ordersList!=null&&!ordersList.isEmpty()){ordersList.forEach(order->{order.setStatus(Orders.COMPLETED);orderMapper.update(order);});}}

这个任务每天凌晨1点执行一次,自动完成超过1小时的"派送中"状态订单。

1.3 数据库查询支持

为了支持定时任务的查询需求,在OrderMapper中定义了相应的查询方法:

/** * 根据状态和下单时间查询订单 * * @param status * @param orderTime * @return */List<Orders>getByStatusAndOrdertimeLT(@Param("status")Integerstatus,@Param("orderTime")LocalDateTimeorderTime);

对应的SQL语句在OrderMapper.xml中定义:

<selectid="getByStatusAndOrdertimeLT"resultType="com.sky.entity.Orders">select * from orders where status = #{status} and order_time&lt;#{orderTime}</select>

二、WebSocket实现实时通信

2.1 WebSocket配置

WebSocket的配置通过WebSocketConfiguration类实现:

@ConfigurationpublicclassWebSocketConfiguration{@BeanpublicServerEndpointExporterserverEndpointExporter(){returnnewServerEndpointExporter();}}

这个配置类启用了WebSocket的端点注册功能。

2.2 WebSocket服务端实现

WebSocket服务端的核心实现位于WebSocketServer类中:

@Component@ServerEndpoint("/ws/{sid}")publicclassWebSocketServer{//存放会话对象privatestaticMap<String,Session>sessionMap=newHashMap<>();/** * 连接建立成功调用的方法 */@OnOpenpublicvoidonOpen(Sessionsession,@PathParam("sid")Stringsid){System.out.println("客户端:"+sid+"建立连接");sessionMap.put(sid,session);}/** * 收到客户端消息后调用的方法 * * @param message 客户端发送过来的消息 */@OnMessagepublicvoidonMessage(Stringmessage,@PathParam("sid")Stringsid){System.out.println("收到来自客户端:"+sid+"的信息:"+message);}/** * 连接关闭调用的方法 * * @param sid */@OnClosepublicvoidonClose(@PathParam("sid")Stringsid){System.out.println("连接断开:"+sid);sessionMap.remove(sid);}/** * 群发 * * @param message */publicvoidsendToAllClient(Stringmessage){Collection<Session>sessions=sessionMap.values();for(Sessionsession:sessions){try{//服务器向客户端发送消息session.getBasicRemote().sendText(message);}catch(Exceptione){e.printStackTrace();}}}}

2.3 WebSocket关键特性说明

  1. 端点路径:通过@ServerEndpoint("/ws/{sid}")注解指定WebSocket的访问路径,其中{sid}是客户端标识符。

  2. 生命周期方法

    • @OnOpen:当客户端建立连接时触发
    • @OnMessage:当收到客户端消息时触发
    • @OnClose:当连接关闭时触发
  3. 会话管理:使用HashMap存储客户端会话,便于后续向特定客户端或所有客户端发送消息。

  4. 消息推送:提供了sendToAllClient方法,可向所有连接的客户端广播消息。

三、实际应用场景

3.1 定时任务应用场景

在苍穹外卖项目中,定时任务主要用于:

  1. 订单状态自动处理:自动取消超时未支付订单,自动完成配送完成的订单
  2. 数据清理:定期清理过期数据
  3. 状态同步:定期同步第三方平台的数据状态

3.2 WebSocket应用场景

WebSocket在该项目中主要用于:

  1. 订单状态通知:当订单状态发生变化时,实时通知管理端页面更新
  2. 实时消息推送:向客户端推送重要通知或提醒
  3. 聊天功能:实现客服或用户间实时沟通

总结

苍穹外卖项目展示了Spring Task和WebSocket在实际项目中的典型应用。定时任务帮助我们自动化处理周期性任务,而WebSocket实现了服务器与客户端之间的实时双向通信。这两种技术的结合使应用程序能够提供更流畅的用户体验和更高的自动化水平。

在实际开发中,合理运用这些技术能显著提升系统的可用性和响应速度,为用户提供更好的服务体验。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/7 23:44:26

学术创作革新!虎贲等考 AI 期刊论文功能:让专业写作告别低效与焦虑

在学术探索的征途中&#xff0c;期刊论文既是研究成果的重要载体&#xff0c;也是学术价值的核心体现。但传统写作模式下&#xff0c;选题卡壳、文献堆砌、查重超标、AIGC 检测预警等问题&#xff0c;让无数科研人、学子陷入 “写了改、改了毙” 的循环&#xff0c;耗时数月却难…

作者头像 李华
网站建设 2026/5/5 6:28:06

我终于知道为什么这么多人夸 XinServer 了

我终于知道为什么这么多人夸 XinServer 了 最近跟几个创业的朋友聊天&#xff0c;发现一个挺有意思的现象。他们都在愁同一个事儿&#xff1a;产品想法贼棒&#xff0c;前端页面也做得飞快&#xff0c;但一到后端和服务器这块&#xff0c;进度就卡住了。要么是后端兄弟排期满了…

作者头像 李华
网站建设 2026/5/3 7:48:20

【原创实践】Docker 镜像批量导出镜像与导入镜像

1. 批量保存镜像到 .tar 文件 #!/bin/bash# 保存目录 SAVE_DIR/root/docker_images_backup mkdir -p $SAVE_DIR# 获取本地所有镜像列表 (Repository:Tag IMAGE ID) docker images --format "{{.Repository}}:{{.Tag}} {{.ID}}" | while read img id; do# 如果 TAG 是…

作者头像 李华
网站建设 2026/5/7 17:03:01

Thinkphp和Laravel宠物店交易商城管理系统的设计与实现-vue

目录 具体实现截图项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理 具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;带文档1万字以上 同行可拿货,招校园代理 Thinkphp和Laravel宠物店交易商城管理系统的设计与实现-vue …

作者头像 李华
网站建设 2026/5/3 4:35:12

接口测试的分水岭时刻:Open-AutoGLM能否彻底取代Postman?真相令人意外

第一章&#xff1a;接口测试的分水岭时刻在软件测试的发展历程中&#xff0c;接口测试的兴起标志着从传统UI驱动验证向更高效、稳定和可维护的测试策略转型的关键节点。随着微服务架构的普及&#xff0c;系统间的依赖更多地通过API进行交互&#xff0c;使得接口成为质量保障的核…

作者头像 李华