【苍穹外卖 | 第十天】
今天主要是学习了如何使用这个websocket这个长连接相互发消息的功能,实现了客户催单和来单提醒;
苍穹外卖 | 第十天
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使用步骤
- 导入Maven坐标,不需要导入,存在于springboot起步依赖中
- 启动类添加注解
@EnableScheduling开启任务调度 - 自定义定时任务类, 方法上加注解
@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));
前提步骤:
- 导入WebSocket的maven坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
- 导入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();
}
}
}
}
- 导入配置类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();
}
}
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)