苍穹外卖(第十天)
任务调度工具,可以按照我们约定的时间自动执行某个代码逻辑。
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);
}
更多推荐
所有评论(0)