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

news/2024/12/13 15:33:57/

外卖开发(八)—— 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.ppmy.cn/news/1554790.html

相关文章

Python中的 `string.Template`:用法和使用场景

Python中的 `string.Template`:用法和使用场景 什么是 `string.Template`?`Template` 的基本用法代码解析使用 `safe_substitute`实用场景1. 动态生成消息2. 生成文件内容如何处理复杂场景?总结在Python中,字符串处理是非常常见的任务,其中string.Template提供了一种简单、…

虚拟机网络部署固化IP

有时我们发现在重启虚拟机后&#xff0c;Linux连接不上了&#xff0c;查看原来是IP变了&#xff0c;这是由于IP没有固化导致&#xff0c;所以要先固化ip。 配置网络环境&#xff1a; 1. 关闭防火墙 &#xff08; 重要 &#xff09; 1:查看防火状态 systemctl status firewa…

InternVL 2.5 介绍

InternVL 2.5 摘要&#xff1a;我们引入了 InternVL 2.5&#xff0c;这是一个先进的多模态大语言模型&#xff08;MLLM&#xff09;系列。它建立在 InternVL 2.0 的基础之上&#xff0c;保留了其核心模型架构&#xff0c;同时在训练和测试策略以及数据质量方面引入了重大改进。…

计算机视觉与医学的结合:推动医学领域研究的新机遇

目录 引言医学领域面临的发文难题计算机视觉与医学的结合&#xff1a;发展趋势计算机视觉结合医学的研究方向高区位参考文章结语 引言 计算机视觉&#xff08;Computer Vision, CV&#xff09;技术作为人工智能的重要分支&#xff0c;已经在多个领域取得了显著的应用成果&…

HCIP——VRRP的实验配置

一、VRRP的理论知识 1.1VRRP&#xff08;虚拟路由冗余协议&#xff09;的概述&#xff1a; 通过把几台路由设别联合组成一台虚拟的路由设备&#xff0c;既能够实现网关的备份&#xff0c;又能解决多个网关之间互相冲突的问题。 1.2VRRP状态机&#xff1a; VRRP协议状态机有…

GESP202412 八级【排队】题解(AC)

》》》点我查看「视频」详解》》》 [GESP202412 八级] 排队 题目描述 小杨所在班级共有 n n n 位同学&#xff0c;依次以 1 , 2 , … , n 1,2,\dots,n 1,2,…,n 标号。这 n n n 位同学想排成一行队伍&#xff0c;其中有些同学之间关系非常好&#xff0c;在队伍里需要排在…

【系统架构设计师】真题论文: 论负载均衡技术在 Web 系统中的应用(包括解题思路和素材)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 真题题目(2019年 试题4)解题思路论文素材参考轮询(Round - Robin)算法原理和场景加权轮询(Weighted Round - Robin)算法原理和场景最小连接数(Least - Connections)算法原理和场景负载均衡架构设计负载均衡…

【机器学习】Lesson 6 - 决策树(分类)

目录 背景 一、适用数据集 1. 数据集选择 2. 本文数据集介绍 二、算法原理 1. 算法简介 2. 决策树分类的应用 3. 模型参数设置 4. 决策树相关知识补充 4.1 节点含义 4.2 节点信息解释 4.3 每一层的含义 三、代码 1. 导入包&数据 2. 数据预处理 3. 数据集划分…