news 2026/4/3 3:04:32

苍穹外卖项目中的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/3/27 23:07:59

OBS录屏偏色 必剪录屏偏绿色 篇灰色 偏白色 录制屏幕偏色的解决问题

正文开始最近录制视频时踩了个大坑——画面要么偏灰发暗&#xff0c;像蒙了一层雾&#xff0c;使用OBS录屏会偏灰色&#xff0c;使用必剪录屏就是直接泛着诡异的绿色&#xff0c;细节完全看不清&#xff0c;好好的内容因为色彩问题直接没法用.别提多闹心了&#xff01;录制的效…

作者头像 李华
网站建设 2026/4/1 23:03:51

AI 写论文哪个软件最好?虎贲等考 AI:从框架到定稿的全流程学术赋能

毕业论文写作&#xff0c;堪称学子们学术生涯中的 “终极挑战”。文献堆积如山不知如何整合&#xff0c;框架搭建反复推翻难以成型&#xff0c;初稿完成后重复率超标、AI 痕迹明显&#xff0c;数据图表排版繁琐又耗时…… 面对这些难题&#xff0c;越来越多学子转向 AI 写作工具…

作者头像 李华
网站建设 2026/3/22 0:29:15

高可靠电子产品设计的IC选用和PCB设计

高可靠性电子产品&#xff08;如航空航天、医疗设备、工业控制、汽车电子等&#xff09;的设计需重点关注长期稳定性、环境适应性&#xff08;如高温/低温、振动、辐射&#xff09;、低失效率&#xff0c;其核心在于IC选型的严格把控和印制板&#xff08;PCB&#xff09;设计的…

作者头像 李华
网站建设 2026/3/14 13:40:40

12.7 现代序列模型:BERT、GPT系列、T5等预训练语言模型

12.7 现代序列模型:BERT、GPT系列、T5等预训练语言模型 基于Transformer架构的预训练语言模型是自然语言处理领域近五年来最重大的范式革命。它们通过在超大规模文本语料上进行自监督预训练,学习通用的语言表示,再通过微调适配到各种下游任务,从而实现了前所未有的性能突破…

作者头像 李华