Spring Task

介绍

任务调度工具,可以按照我们约定的时间自动执行某个代码逻辑

cron表达式

一个字符串
够再规则:分为6或7个域,每个域代表一个含义
每个域的含义分别为:秒、分钟、小时、日、月、周、年(可选)

入门案例

1、导入maven坐标spring-context(已存在)
2、启动类添加注解@EnableScheduling开启任务调度
3、自定义定时任务类

订单状态定时处理

package com.sky.task;

import com.sky.constant.MessageConstant;
import com.sky.entity.Orders;
import com.sky.mapper.OrderMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.List;

@Component
@Slf4j
public class OrderTask {

    @Autowired
    private OrderMapper orderMapper;

    @Scheduled(cron = "0 * * * * ?")
    public void processTimeoutOrder(){
        //每分钟检查
        //获取待接单且超时订单列表
        LocalDateTime time=LocalDateTime.now().plusMinutes(-15);
        List<Orders> list=orderMapper.getByStatusAndOrderTimeLT(Orders.PENDING_PAYMENT,time);
        log.info("超时定时器启动,超时订单为{}",list);
        //修改订单状态
        list.stream().forEach(orders ->{
            orders.setCancelTime(LocalDateTime.now());
            orders.setCancelReason("订单超时,自动取消");
            orders.setStatus(Orders.CANCELLED);
            orderMapper.update(orders);
        });
    }

    @Scheduled(cron = "0 0 1 * * ?")
    public void precessDeliveryOrder(){
        //每天晚上一点更新
        //获取派送中订单列表
        LocalDateTime time=LocalDateTime.now().plusMinutes(-60);
        List<Orders> list=orderMapper.getByStatusAndOrderTimeLT(Orders.DELIVERY_IN_PROGRESS,time);
        log.info("未完成定时器启动,未完成订单为{}",list);
        //修改所有订单为已完成
        list.stream().forEach(orders ->{
            orders.setCancelTime(LocalDateTime.now());
            orders.setStatus(Orders.COMPLETED);
            orderMapper.update(orders);
        });
    }
}

WebSocket

基于TCP的一种新的网络协议,实现浏览器与服务器全双工通信-浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。
入门案例:
1、直接使用websocket.html页面作为WebSocket客户端
2、导入WebSocket的maven坐标

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

3、提供WebSocket服务端组件WebSocketServer,用于和客户端通信
4、导入配置类WebSocketConfiguration,注册WebSocket的服务端组件
5、导入定时任务类WebSocketTask,定时向客户端推送数据

来单提醒

用户下单并且支付成功后,第一时间通知外卖商家,通知的形式有如下两种:
语音播报
弹出提示框

设计:
通过websocket实现管理端页面和服务端保持长连接状态
当客户支付后,调用websocket的相关API实现服务端向客户端推送消息
客户端浏览器解析服务端推送的消息,判断是来单提醒还是客户催单,并进行相应消息提示和语音播报
约定服务端发给客户端浏览器的数据格式JSON,字段包括:type、orderid、content
type:为消息类型,1为来单提醒,2为客户催单
orderid:为订单id
content:为消息内容

客户催单

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

        Map map=new HashMap<>();
        map.put("type",2);
        map.put("orderId",id);
        map.put("content","订单号"+order.getNumber());
        String s = JSON.toJSONString(map);
        webSocketServer.sendToAllClient(s);
    }
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐