黑马苍穹外卖8 Spring Task+WebSocket 来单提醒和客户催单

news2024/12/28 2:27:29

Spring Task

Spring提供的任务调度工具,按照约定时间自动执行代码。【以前的都是基于请求(http)响应的】

cron表达式

通过cron表达式可以定义任务触发时间。
在这里插入图片描述

cron表达式生成器
(1)导入spring-context
(2)@EnableScheduling开启任务调度,在启动类上加。
(3)自定义定时任务类

订单状态定时处理

超时订单处理

  1. 下单后未支付,订单一直处于“待支付”状态
    每分钟检查一次,判断时候否存在支付超时订单(下单超过15分钟认为支付则判定为支付超时订单),
    存在则修改订单状态为“已取消”
  2. 用户收货,订单一直处于“派送中”
    每天凌晨一点检查是否存在“派送中”的订单,存在则修改订单状态为“已完成”

task.OrderTask.java

@Component
@Slf4j
public class OrderTask {

    @Autowired
    private OrderMapper orderMapper;

    /**
     * 处理超时订单
     */
    @Scheduled(cron = "0 * * * * ?")//每分钟触发一次  秒 分 时 日 月 周 年(可选)
    public void processTimeOutOrders() {
        LocalDateTime time = LocalDateTime.now().plusMinutes(-15);//当前时间-15
        // 根据这个去查 (处于待付状态的,下单时间<当前时间-15)
        List<Orders> orders = orderMapper.getByStatusAndOrderTimeLT(Orders.PENDING_PAYMENT, time);
        if (orders != null && orders.size() != 0) {
            List<Long> ids = new ArrayList<>();
            orders.forEach((order) ->
                ids.add(order.getId())
            );
            orderMapper.updateTimeOutByIds(Orders.CANCELLED, "订单超时,自动取消", LocalDateTime.now(), ids);//修改订单状态
        }
    }

    /**
     * 检查一直处于派送中的订单
     */
    @Scheduled(cron = "0 0 1 * * ?")//每天凌晨一点触发一次
    public void processDeliveringOrders() {
        LocalDateTime time = LocalDateTime.now().plusMinutes(-60);
        List<Orders> orders = orderMapper.getByStatusAndOrderTimeLT(Orders.DELIVERY_IN_PROGRESS, time);
        if (orders != null && orders.size() != 0) {
            List<Long> ids = new ArrayList<>();
            orders.forEach((order) ->
                ids.add(order.getId())
            );
            orderMapper.updateDeliveringByIds(Orders.COMPLETED, ids);
        }
    }

}
@Select("select * from orders where status=#{status} and order_time<#{orderTime}")
    List<Orders> getByStatusAndOrderTimeLT(Integer status, LocalDateTime orderTime);

WebSocket

基于TCP的一种新的网络协议。实现了浏览器与服务器全双工通信——浏览器和服务器只需完成一次握手,两者就可以建立连接,双向数据传输
在这里插入图片描述
HTTP:浏览器(客户端)—服务器:浏览器请求服务器才响应。
WebSocket:两边都可以主动通信。

应用场景:网页聊天、视频弹幕,股票信息实时更新(服务器主动推送到网页上的)
在这里插入图片描述

/**
 * WebSocket服务
 */
@Component
@ServerEndpoint("/ws/{sid}")//也是根据路径来匹配
public class WebSocketServer {

    //存放会话对象
    private static Map<String, Session> sessionMap = new HashMap();

    /**
     * 连接建立成功调用的方法
     */
    @OnOpen//变成回调方法---就是建立连接后会自动调用
    public void onOpen(Session session, @PathParam("sid") String sid) {
        System.out.println("客户端:" + sid + "建立连接");
        sessionMap.put(sid, session);
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     */
    @OnMessage//类似@controller
    public void onMessage(String message, @PathParam("sid") String sid) {
        System.out.println("收到来自客户端:" + sid + "的信息:" + message);
    }

    /**
     * 连接关闭调用的方法
     *
     * @param sid
     */
    @OnClose
    public 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();
            }
        }
    }

}

定时任务类:
task.WebSocketTask.java

@Component
public class WebSocketTask {//定时任务类
    @Autowired
    private WebSocketServer webSocketServer;

    /**
     * 通过WebSocket每隔5秒向客户端发送消息
     */
    @Scheduled(cron = "0/5 * * * * ?")
    public void sendMessageToClient() {
        //调群发的方法
        webSocketServer.sendToAllClient("这是来自服务端的消息:" + DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalDateTime.now()));
    }
}

来单提醒

用户下单且支付成功即使通知商家。
在这里插入图片描述
请求:ws://localhost/ws/0yf1emeoqu8a
先请求到ngnix,然后nginx把请求转发到后端的Tomcat服务器
基于nginx的反向代理然后把请求转发过来的

在OrderServiceImpl.java 里public void paySuccess(String outTradeNo) 类中添加

 //通过websocket想客户端推送消息 type prderId content
        //来单提醒
        HashMap<String, Object> map = new HashMap<>();
        map.put("type", 1);//1 来单提醒  2 客户接单
        map.put("orderId", ordersDB.getId());
        map.put("content", "订单号:" + outTradeNo);

        //发送给客户端
        webSocketServer.sendToAllClient(JSONObject.toJSONString(map));

客户催单

在这里插入图片描述
客户触发,客户发起的接口请求:
在这里插入图片描述

Controller:

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

service

 @Override
    public void reminder(Long id) {
        Orders order = orderMapper.getById(id);
        if (order == null) {
            throw new  OrderBusinessException(MessageConstant.ORDER_NOT_FOUND);
        }

        HashMap<String, Object> map = new HashMap<>();
        map.put("type",2);
        map.put("orderId",id);
        map.put("content","订单号:"+ id);

        webSocketServer.sendToAllClient(JSONObject.toJSONString(map));//向客户端推送消息
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IEEE-Trans系列!版面稀缺,现在投稿可加急处理,代表作神刊!

【SciencePub学术】今天小编给大家推荐一本计算机领域的SCI&#xff0c;隶属于IEEE出版社旗下&#xff0c;现已稳定检索49年&#xff01;影响因子4.0-5.0之间&#xff0c;JCR1区&#xff0c;中科院2区&#xff0c;质量口碑甚誉&#xff01; 有论文发表需求的学者可以后台联系张…

加速业务布局,30年老将加盟ATFX,掌舵运营新篇章

全球领先的差价合约经纪商ATFX日前宣布了一项重大人事任命&#xff0c;聘请业界资深人士约翰博格(John Bogue)为机构业务运营总监。约翰博格是一名行业老将&#xff0c;曾在差价合约界深耕三十余载。伴随其加入ATFX&#xff0c;相信他的深厚专业知识和从业经验将为ATFX机构业务…

视频云计算的未来发展趋势:智能化、个性化与云端协同助力智慧城市安防监控

随着信息技术的飞速发展&#xff0c;云计算作为一种全新的服务模式&#xff0c;正在改变我们处理数据和信息的方式。而视频云计算技术&#xff0c;作为云计算领域的一个重要分支&#xff0c;以其独特的优势&#xff0c;正在逐步渗透到我们生活的各个领域。 一、视频云计算技术…

祝贺:东兴朱雀桥成为一点点的NFC果汁供应商。

东兴朱雀桥进出口&#xff1a;品质之选&#xff0c;护航一点点奶茶的成长&#xff01; 据记者了解&#xff0c;该家公司是专注于进口越南特色NFC果汁&#xff1a;薇妮她VINUT人参果汁饮料的研发与生产&#xff0c;以其丰富的产品线和卓越品质&#xff0c;成为了行业内的佼佼者…

多用户商城进销存管理如何处理?

竞争激烈的市场环境&#xff0c;多用户商城管理是一项复杂而具有挑战性的任务。特别是在进销存&#xff08;进货、销售、库存&#xff09;管理方面&#xff0c;面对多用户商城的复杂结构&#xff0c;传统的手动操作已经难以满足高效和准确的需求。因此&#xff0c;借助现代化的…

自动驾驶系统功能安全解决方案解析

电信、公用事业、运输和国防等关键基础设施服务需要定位、导航和授时&#xff08;PNT&#xff09;技术来运行。但是&#xff0c;广泛采用定位系统&#xff08;GPS&#xff09;作为PNT信息的主要会引入漏洞。 在为关键基础设施制定PNT解决方案时&#xff0c;运营商必须做出两个…

Ubuntu使用apt-get指令下载

一、前言 本节来学习 ubuntu 中的 apt-get 命令&#xff0c;ubuntu 为什么而闻名&#xff1f;第一&#xff0c; ubuntu 有一个非常好的图形界面&#xff0c;第二就是 ubuntu 的 apt-get 功能强大。 什么是 apt-get 呢&#xff0c;在 windows 上安装软件&#xff0c;大家一定都…

使用c++栈刷题时踩坑的小白错误

根据图片中提供的代码&#xff0c;可以发现以下三处错误&#xff1a; 错误原因&#xff1a;条件判断语句的逻辑错误。 代码行&#xff1a;if (res.top() ! e || res.empty())&#xff08;第7行&#xff09; 问题&#xff1a;如果 res 为空&#xff08;res.empty() 为 true&…

已解决javax.xml.datatype.DatatypeConfigurationException异常的正确解决方法,亲测有效!!!

已解决javax.xml.datatype.DatatypeConfigurationException异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 出现问题的场景 示例场景 报错原因 解决思路 解决方法 分析错误日志 检查类路径 验证自定义实现类 检查系统属…

怎么实现微信支付?

微信小程序中微信支付&#xff08;前端流程&#xff09; 微信支付前准备工作 微信公众平台绑定商户号 微信支付平台配置好后端信息支付前要有用户的openid 1. 客户端点击支付按钮 在用户点击支付按钮时&#xff0c;触发支付流程。 // 绑定支付按钮点击事件 function onPayB…

【PC端】魔力宝贝服务端+登录器源码+配套网站+后台

配套源码 启动也很简单 一共两部 下载地址 www.t1gm.com 下面上图

itsm服务管理工具有哪些?

itsm&#xff08;IT服务管理&#xff09;是现代企业管理IT服务的关键框架&#xff0c;可帮助组织提供高效的IT服务&#xff0c;并确保业务持续运行。使用itsm服务管理工具是实现这一目标的关键&#xff0c;下面我们来看看itsm服务管理工具有哪些&#xff1a; 1. ServiceDesk Pl…

Stable Diffusion 亲测这几个SDXL大模型,真的非常好用!

大家好我是极客菌&#xff0c;前两周Stable Diffusion WebUI1.6.0发布了&#xff0c;新增了很多对SDXL生态的支持。 而ControlNET也对SDXL的支持也逐渐稳定。 SDXL的生态终于有一点起色了&#xff0c;我也觉得是时候&#xff0c;可以来写一篇SDXL的大模型推荐了。 在推荐之前…

云层区分神经网络模型——二分类

云层区分神经网络模型——二分类 问奶奶&#xff0c;是什么让他们维护一份感情长达年&#xff0c;奶奶说那个年代什么东西坏了都会想要修&#xff0c;现在什么坏了都想着换。 安装依赖 # 要运行脚本&#xff0c;请先安装以下库&#xff1a;pip install tensorflowpip install …

uniapp——上传图片获取到file对象而非临时地址——基础积累

最近在看uniapp的代码&#xff0c;遇到一个需求&#xff0c;就是要实现上传图片的功能 uniapp 官网地址&#xff1a;https://uniapp.dcloud.net.cn/ 上传图片有对应的API&#xff1a; uni.chooseImage方法&#xff1a;https://uniapp.dcloud.net.cn/api/media/image.html#choo…

探索Linux的奇妙世界:第二关---Linux的基本指令(上篇)

1. xshell与服务器的连接 想必大家在看过上一期视频时已经搭建好了Linux的环境了并且已经下好了终端---xshell了吧?让我来带大家看一看下好了是什么样子的: 第一次登陆会让你连接你的服务器,就是我们买的云服务器,买完之后需要把公网地址ip复制过来进行链接,需要用户名和密码连…

秋招Java后端开发冲刺——关系型数据库篇(Mysql)

本文介绍关系型数据库及其代表Mysql数据库&#xff0c;并介常见面试题目。 一、数据库概述 1. 数据库&#xff08;Database, DB&#xff09;&#xff1a;是长期储存在计算机内的、有组织的、可共享的数据集合。 2. 数据库管理系统&#xff08;Database Management System, D…

MATLAB-NGO-CNN-SVM,基于NGO苍鹰优化算法优化卷积神经网络CNN结合支持向量机SVM数据分类(多特征输入多分类)

NGO-CNN-SVM&#xff0c;基于NGO苍鹰优化算法优化卷积神经网络CNN结合支持向量机SVM数据分类(多特征输入多分类) 1.数据均为Excel数据&#xff0c;直接替换数据就可以运行程序。 2.所有程序都经过验证&#xff0c;保证程序可以运行。 3.具有良好的编程习惯&#xff0c;程序均…

408计算机网络--物理层

一、物理层概述 物理层是干嘛使得&#xff1f; 物理层解决如何在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输媒体。 物理层主要任务是确定与传输媒体接口有关的一些特性。定义标准可以理解为插排上的两孔三孔 机械特性&#xff1a;定义物理连接…

质量保证计划书(DOC原件)

2 质量目标 3 项目基本情况 4 资源 4.1 人员 4.1.1 组织结构 4.1.2 职责 4.2 工具及设施 5 质量保证的主要工作 6 质量保证工作量估算 7 质量保证工作提交的产物 8 变更管理 9 评价标准 10 形成的记录 软件全套精华资料包清单部分文件列表&#xff1a; 工作安排任…