外卖开发(八)—— SpringTask(定时任务) 和 WebSocket网络协议

外卖开发(八)—— SpringTask 和 WebSocket

  • 一、利用SpringTask完成定时任务
    • 1、cron表达式
    • 2、springtask实现
  • 二、使用webSocket实现接单、催单提醒
    • 1、代码分析
    • 2、催单提醒

一、利用SpringTask完成定时任务

Spring Task是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。

定位: 定时任务框架
作用: 定时自动执行某段Java代码

应用场景:
信用卡每月还款提醒
银行贷款每月还款提醒
火车票售票系统处理未支付订单。入职纪念日为用户发送通知

只要是需要定时处理的场景都可以使用Spring Task

1、cron表达式

@Scheduled(cron = "0 0 1 * * ? ") 注解

cron表达式其实就是一个字符串,通过cron表达式可以定义任务触发的时间

构成规则:分为6或7个域,由空格分隔开,每个域代表一个含义

每个域的含义分别为:秒、分钟、小时、日、月、周、年(可选)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
cron表达式在线生成: https://cron.qqe2.com/

在这里插入图片描述

2、springtask实现

使用springtask解决外卖订单已经派送成功,用户迟迟不点击已送达,需要我们在一个特点的时间点(凌晨一点)检查一天前的所有 “正在派送” 的订单,并修改状态为已完成。

在这里插入图片描述

需求分析:
用户收货后管理端未点击完成按钮,订单一直处于“派送中”状态
通过定时任务每天凌晨1点检查一次是否存在“派送中”的订单,如果存在则修改订单状态为“已完成”

1、自定义定时任务类

OrderTask.java

@Component
@Slf4j
public class OrderTask {@Autowiredprivate OrderMapper orderMapper;/*** 每天夜里一点检查是否存在已派送未完成的订单*/@Scheduled(cron = "0 0 1 * * ? ")public void processDeliveryOrder(){log.info("系统处理未支付订单:{}",LocalDateTime.now());LocalDateTime localDateTime = LocalDateTime.now().plusHours(-1); //检查时间小于0:00的订单List<Orders> orders = orderMapper.checkDeliveryUnsuccess(Orders.DELIVERY_IN_PROGRESS,localDateTime);if(orders != null && orders.size() > 0){for (Orders order : orders){order.setPayStatus(Orders.COMPLETED);order.setDeliveryTime(LocalDateTime.now());orderMapper.update(order);}}}
}

2、mapper接口

/*** 每天一点检查前一日正在派送的订单,改为已完成* @param status* @param deliveryTime* @return*/@Select("select * from orders where status = #{status} and delivery_time < #{deliveryTime}")List<Orders> checkDeliveryUnsuccess(Integer status,LocalDateTime deliveryTime);

通过上述springtask类,实现了每天凌晨1点,定时去数据库中搜索前一天的派送中的订单,并统一完成订单。

二、使用webSocket实现接单、催单提醒

WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成—次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

1、代码分析

websocket配置类

WebSocketConfiguration.java

/*** WebSocket配置类,用于注册WebSocket的Bean*/
@Configuration
public class WebSocketConfiguration {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}}

websocket服务

WebSocketServer.java

/*** WebSocket服务*/
@Component
@ServerEndpoint("/ws/{sid}")  //前端与服务端连接的路径
public class WebSocketServer {//存放会话对象private static Map<String, Session> sessionMap = new HashMap();/*** 连接建立成功调用的方法*/@OnOpenpublic void onOpen(Session session, @PathParam("sid") String sid) {System.out.println("客户端:" + sid + "建立连接");sessionMap.put(sid, session);}/*** 收到客户端消息后调用的方法** @param message 客户端发送过来的消息*/@OnMessagepublic void onMessage(String message, @PathParam("sid") String sid) {System.out.println("收到来自客户端:" + sid + "的信息:" + message);}/*** 连接关闭调用的方法** @param sid*/@OnClosepublic void onClose(@PathParam("sid") String sid) {System.out.println("连接断开:" + sid);sessionMap.remove(sid);}/*** 群发** @param message*/public void sendToAllClient(String message) {Collection<Session> sessions = sessionMap.values();for (Session session : sessions) {try {//服务器向客户端发送消息session.getBasicRemote().sendText(message);} catch (Exception e) {e.printStackTrace();}}}}

2、催单提醒

用户在小程序中点击催单按钮后,需要第一时间通知外卖商家。
在这里插入图片描述

设计:

通过WebSocket实现管理端页面和服务端保持长连接状态

当用户点击催单按钮后,调用WebSocket的相关API实现服务端向客户端推送消息

客户端浏览器解析服务端推送的消息,判断是来单提醒还是客户催单,进行相应的消息提示。约定服务端发送给客户端浏览器的数据格式为JSON,字段包括: type,orderld, content

  • type为消息类型,1为来单提醒2为客户催单
  • orderld为订单id
  • content为消息内容

在这里插入图片描述

OrderController.java

/*** 用户催单* @param id* @return*/@GetMapping("/reminder/{id}")@ApiOperation("用户催单")public Result userReminder(@PathVariable Long id){orderService.userReminder(id);return Result.success();}

OrderService.java

/*** 用户催单* @param id*/@Overridepublic void userReminder(Long id) {Orders orders = orderMapper.queryOrderById(id);  //根据id查询订单详情String number = orders.getNumber();Map map = new HashMap();map.put("type",2);map.put("orderId",id);map.put("content","订单号:" + number);String json = JSON.toJSONString(map);webSocketServer.sendToAllClient(json);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/488540.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式系统中的并行编程模型:汇总解析与应用

概述&#xff1a;随着嵌入式系统处理能力的不断提升&#xff0c;并行编程在其中的应用愈发广泛。本文深入探讨了多种专门为嵌入式设计的并行编程模型&#xff0c;包括任务队列模型、消息传递模型、数据并行模型、异构多核并行模型、实时任务调度模型以及函数式并行模型。详细阐…

MTK 配置文件梳理

文章目录 MTK 日常配置总结屏幕默认横竖屏显示ro.build.characteristics 属性修改修改点一&#xff1a;build\core\product_config.mk修改点二&#xff1a;build\make\core\main.mk修改是否成功&#xff0c;adb 验证 配置部分系统app handheld_product.mk配置系统属性、第三方应…

CentOS 上如何查看 SSH 服务使用的端口号?

我们知道&#xff0c;linux操作系统中的SSH默认情况下&#xff0c;端口是使用22&#xff0c;但是有些线上服务器并不是使用的默认端口&#xff0c;那么这个时候&#xff0c;我们应该如何快速知道SSH使用的哪个端口呢&#xff1f; 1、通过配置文件查看 cat /etc/ssh/sshd_confi…

关于Redis哨兵机制实验操作步骤

需要搭建帮助的可以去taobao搜索Easy Company技术服务&#xff0c;谢谢&#xff01;&#xff01;&#xff01; 需要搭建帮助的可以去taobao搜索Easy Company技术服务&#xff0c;谢谢&#xff01;&#xff01;&#xff01; 一、配置哨兵(sentinel) 创建三个哨兵配置文件&…

Vue 集成地图

电子地图应用广泛&#xff1a; 网约车 : 在网约车 场景中实现 准定位 、导航 、司乘同显 &#xff0c;精准计费 智慧物流、生活服务等&#xff0c;本专题课程囊括各类应用场景 学习 电子地图解决方案&#xff0c;满足学员工作学习各类需求。 基础知识 学习 集成 地图之前需…

Qt-chart 画折线图(文字x轴)

图 代码 QLineSeries *seriesReality new QLineSeries();seriesReality->setColor(Qt::green);QLineSeries *seriesTar new QLineSeries();seriesTar->setColor(Qt::yellow);// 创建并配置X轴&#xff08;文字标签&#xff09;QStringList categories;for (int i 0; …

农业园区气象站

农业园区气象站是一种专为农业生产和科研设计的气象监测设备&#xff0c;它集成了多种传感器和技术&#xff0c;用于实时、准确地监测和记录农业园区内的气象数据。以下是农业园区气象站的主要功能和用处&#xff1a; 一、主要功能 实时监测&#xff1a;农业园区气象站能够实时…

DocFlow票据AI自动化处理工具:出色的文档解析+抽取能力,提升企业文档数字化管理效能

目录 财务应付 金融信贷业务 近期&#xff0c;DocFlow票据自动化产品正式上线。DocFlow是一款票据AI自动化处理工具&#xff0c;支持不同版式单据智能分类扩展&#xff0c;可选功能插件配置流程&#xff0c;满足多样业务场景。 随着全球化与信息化进程&#xff0c;企业的文件…

用于卫星影像间接RPC模型精化的通用光束法平差方法

引言 介绍了通用RPC模型的表达式&#xff0c;which has been down to death 描述了RPC模型产生误差的原因——主要与定义传感器方位的姿态角有关。 每个影像都会对应一个三维点云&#xff0c;但是对同一地物拍摄的不同影像对应出来的三维点云是不一样的&#xff0c;所以才需…

Cerebras 推出 CePO,填补推理与规划能力的关键空白

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

AAAI 2025 camera ready提交注意事项

您必须在截止日期前填写、签署并返回 AAAI 版权表&#xff08;除非 AAAI Press 指示使用 AAAI 分发许可证&#xff09;。 您必须根据作者的格式说明阅读并格式化您的论文和 PDF。 您必须使用我们的电子提交表格准时提交您的电子文件和摘要。 您必须向 AAAI Press 支付任何所需的…

Maven学习(Maven项目模块化。模块间“继承“机制。父(工程),子项目(模块)间聚合)

目录 一、Maven项目模块化&#xff1f; &#xff08;1&#xff09;基本介绍。 &#xff08;2&#xff09;汽车模块化生产再聚合组装。 &#xff08;3&#xff09;Maven项目模块化图解。 1、maven_parent。 2、maven_pojo。 3、maven_dao。 4、maven_service。 5、maven_web。 6…

关于GaussDB

一、GaussDB的层级关系 &#xff0c;关于schemas的定位&#xff0c;到底是个什么&#xff0c;其实就可以理解为一个文件夹 数据库服务器 --> databases --> schemas --> tables schema类似于文件夹&#xff0c;一个数据库database里面可以有多个文件夹&#xff0c;每…

对流层路径延迟对SAR方位压缩的影响(CSDN_20240301)

目录 仿真参数 方位向脉冲压缩与高阶多普勒参数的关系 仿真结果 2m分辨率 1m分辨率 0.5m分辨率 0.3m分辨率 0.2m分辨率 0.1m分辨率 0.05m分辨率 小结 对流层路径延迟对方位脉冲压缩的影响 仿真参数 地球参数 赤道半径&#xff08;m&#xff09; 6378140 极半径&a…

xss原理分析与剖析

001 第三方劫持 (外调J/C)&#xff1a; 本方法是我看长短短贴代码时知晓的&#xff0c;这篇文章我只是把这个攻击手法整理了出来&#xff0c;来说明这个漏洞&#xff0c;这个攻击手法并不是我发现的&#xff0c;我也不是太清楚是谁。“第三方劫持”就是把资源域的服务器的权限…

使用阿里云搭建镜像仓库

流程如图 接着登录到安装docker的客户机上 #执行如下操作 先登录 docker login --usernamealiyun2933717661 crpi-q5qqr0d39o6em66u.cn-beijing.personal.cr.aliyuncs.com Password: #输入密码 WARNING! Your password will be stored unencrypted in /root/.docker/config.j…

中国卫生健康统计年鉴Excel+PDF电子版2022年-社科数据

中国卫生健康统计年鉴ExcelPDF电子版2022年-社科数据https://download.csdn.net/download/paofuluolijiang/90028752 《中国卫生健康统计年鉴》2022年版涵盖了2006至2022年间的卫生健康相关数据&#xff0c;提供了丰富的统计信息。该年鉴包含16个部分&#xff0c;内容涉及医疗…

HBuilderX(uni-app)Vue3路由传参和接收路由参数!!

uni-app搭建小程序时候Vue3语法接收路由参数&#xff0c;去官方文档查看&#xff0c;是onLoad的option接收参数&#xff0c;我试过&#xff0c;接收不到&#xff0c;上网查各种方法也是不太行&#xff0c;最后自己琢磨出来了&#xff0c;这参数藏得还挺深&#xff01;&#xff…

手机租赁系统开发全流程解析与实用指南

内容概要 在如今快速发展的科技时代&#xff0c;手机租赁系统已经成为一种新兴的商业模式&#xff0c;非常符合当下市场需求。那么&#xff0c;在开发这样一个系统的时候&#xff0c;首先要从需求分析和市场调研开始。在这一阶段&#xff0c;你需要了解用户需要什么&#xff0…

【Compose multiplatform教程】01 创建你的多平台项目 <官网搬运>

这是 “创建带有共享逻辑和用户界面的 Compose 多平台应用” 教程的第一部分。 第一步&#xff1a;创建你的多平台项目 第二步&#xff1a;探究可组合代码 第三步&#xff1a;修改项目 第四步&#xff1a;创建你自己的应用程序 在这里&#xff0c;你将学习如何使用 Kotlin 多平…