Spring Task

定时任务调度框架,按照制定的时间来完成对应的任务,通过cron表达式来指定触发时间

cron表达式

cron表达式在线生成器:https://cron.qqe2.com/

说明:一般的值不同时设置,其中一个设置,另一个用?表示。

可以直接在这个网站上面,只要根据自己的要求去生成corn表达式即可。所以一般就不用自己去编写这个表达式。

基本内容

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

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

每个域的含义分别为:秒、分钟、小时、日、月、周、年(可选)

通配符:

* 表示所有值,每秒每分钟每小时每天…;

? 表示未说明的值,即不关心它为何值;

- 表示一个指定的范围;

, 表示附加一个可能值;

/ 符号前表示开始时间,符号后表示每次递增的值;

举例:

2022年10月12日上午9点整 对应的cron表达式为:0 0 9 12 10 ? 2022
每天凌晨 1 点(01:00:00 到 01:59:59)的每一秒:* * 1 * * ?
凌晨 1 点整执行一次 : 0 0 1 * * ?

Spring Task使用步骤

  1. 导入Maven坐标,不需要导入,存在于springboot起步依赖中
  2. 启动类添加注解 @EnableScheduling 开启任务调度
  3. 自定义定时任务类, 方法上加注解 @Scheduled(cron = "0/5 * * * * ?")

定时任务类加@Component 注解,让这个类可以被spring容器扫描到从而执行

 /**
     * 定时任务 每隔5秒触发一次
     */
    @Scheduled(cron = "0/5 * * * * ?")
    public void executeTask(){
        log.info("定时任务开始执行:{}",new Date());
    }

定时处理订单状态

/**
 * 自定义定时任务,实现订单状态定时处理
 */
@Component
@Slf4j
public class OrderTask {

    @Autowired
    private OrderMapper orderMapper;

    /**
     * 处理支付超时订单
     */
    @Scheduled(cron = "0 * * * * ?")
    public void processTimeoutOrder(){
        log.info("处理支付超时订单:{}", new Date());
    }

    /**
     * 处理“派送中”状态的订单
     */
    @Scheduled(cron = "0 0 1 * * ?")
    public void processDeliveryOrder(){
        log.info("处理派送中订单:{}", new Date());
    }

}

@Component 注解对于定时任务类(如 OrderTask)是必须的。
它的作用是将该类注册为 Spring 容器的一个 Bean,这样 @Scheduled 注解才能生效,Spring 才会自动扫描并调度定时任务方法。
如果没有 @Component,Spring 不会管理这个类,定时任务也不会被执行。

WebSocke

介绍

在这里插入图片描述
今天主要是学习了如何使用这个websocket这个长连接相互发消息的功能,实现了客户催单和来单提醒;

业务实现

注入webshocked的bean对象


 	@Autowired
    private WebSocketServer webSocketServer;

向用户端传递消息,使用组件WebSocketServer类里面的 sendToAllClient方法

Map map = new HashMap();
        map.put("type", 2);//消息类型,1表示来单提醒
        map.put("orderId", id);
        map.put("content", "订单号:" + orders.getNumber());

        //通过WebSocket实现来单提醒,向客户端浏览器推送消息
        webSocketServer.sendToAllClient(JSON.toJSONString(map));

前提步骤:

  1. 导入WebSocket的maven坐标
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
  1. 导入WebSocket服务端组件WebSocketServer,用于和客户端通信,
package com.sky.websocket;

import org.springframework.stereotype.Component;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/**
 * 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
    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();
            }
        }
    }

}

  1. 导入配置类WebSocketConfiguration,注册WebSocket的服务端组件
package com.sky.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/**
 * WebSocket配置类,用于注册WebSocket的Bean
 */
@Configuration
public class WebSocketConfiguration {

    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }

}

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐