package com.ruoyi.system.listener;
|
|
|
import com.ruoyi.common.core.utils.DateUtils;
|
import com.ruoyi.common.core.utils.StringUtils;
|
import com.ruoyi.system.api.constant.DelayTaskEnum;
|
import com.ruoyi.system.api.service.RemoteActivityService;
|
import com.ruoyi.system.api.service.RemoteConfigService;
|
import com.ruoyi.system.api.service.RemoteCouponService;
|
import com.ruoyi.system.api.service.RemoteGoodsService;
|
import com.ruoyi.system.api.service.RemoteOrderService;
|
import lombok.extern.log4j.Log4j2;
|
import org.springframework.data.redis.connection.Message;
|
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.data.redis.core.ValueOperations;
|
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
|
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
|
import org.springframework.stereotype.Component;
|
|
import javax.annotation.Resource;
|
import java.util.Date;
|
|
/**
|
* @author jqs34
|
* @ClassName RedisListener
|
* @description: redis监听
|
* @date 2023年06月06日
|
* @version: 1.0
|
*/
|
@Log4j2
|
@Component
|
public class RedisListener extends KeyExpirationEventMessageListener {
|
|
private RedisTemplate<String, Object> redisTemplate;
|
|
@Resource
|
private RemoteConfigService remoteConfigService;
|
|
@Resource
|
private RemoteCouponService remoteCouponService;
|
|
@Resource
|
private RemoteActivityService remoteActivityService;
|
|
@Resource
|
private RemoteOrderService remoteOrderService;
|
|
@Resource
|
private RemoteGoodsService remoteGoodsService;
|
|
public RedisListener(RedisMessageListenerContainer listenerContainer,
|
RedisTemplate redisTemplate) {
|
super(listenerContainer);
|
this.redisTemplate=redisTemplate;
|
}
|
|
@Override
|
public void onMessage(Message message, byte[] pattern) {
|
// 用户做自己的业务处理即可,注意message.toString()可以获取失效的key
|
String expiredKey = message.toString();
|
log.info("RedisListener key={}", expiredKey);
|
String time= DateUtils.dateTime(new Date());
|
try {
|
if(StringUtils.isNotBlank(expiredKey)){
|
if(expiredKey.contains("-")){
|
String[] split = expiredKey.split("-");
|
String operation=split[0];
|
if(DelayTaskEnum.COUPON_SEND_DELAY_TASK.getCode().equals(operation)){
|
//自动发送优惠券
|
autoTimeSendCoupon(split[1]);
|
}else if(DelayTaskEnum.ACTIVITY_START_TASK.getCode().equals(operation)){
|
//自动开始任务
|
autoStartActivity(split[1]);
|
}else if(DelayTaskEnum.ACTIVITY_END_TASK.getCode().equals(operation)){
|
//自动结束任务
|
autoEndActivity(split[1]);
|
}else if(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode().equals(operation)){
|
//自动结束任务
|
autoCancelOrder(split[1]);
|
} else if (DelayTaskEnum.LIVE_APPOINTMENT_TASK.getCode().equals(operation)) {
|
push(Long.valueOf(split[1]));
|
}
|
|
//删除失效的key
|
redisTemplate.delete(expiredKey);
|
}
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
}
|
|
/**
|
* 推送消息
|
* @param appointmentId
|
*/
|
private void push(Long appointmentId) {
|
remoteGoodsService.push(appointmentId);
|
//删除定时任务
|
remoteConfigService.deleteDelayTask(DelayTaskEnum.LIVE_APPOINTMENT_TASK.getCode()+"-"+appointmentId);
|
}
|
|
public <T> T getAndSet(final String key, T value){
|
T oldValue=null;
|
try {
|
ValueOperations<String, Object> operations = redisTemplate.opsForValue();
|
oldValue =(T) operations.getAndSet(key, value);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return oldValue;
|
}
|
|
//延时任务表
|
//自动定时发送优惠券
|
private void autoTimeSendCoupon(String couponId){
|
log.info("autoTimeSendCoupon scheduler task is running :" + couponId);
|
remoteCouponService.autoTimeSendCoupon(couponId);
|
//删除定时任务
|
remoteConfigService.deleteDelayTask(DelayTaskEnum.COUPON_SEND_DELAY_TASK.getCode()+"-"+couponId);
|
}
|
|
private void autoStartActivity(String activityId){
|
log.info("autoStartActivity scheduler task is running :" + activityId);
|
remoteActivityService.startActivity(activityId);
|
//删除定时任务
|
remoteConfigService.deleteDelayTask(DelayTaskEnum.ACTIVITY_START_TASK.getCode()+"-"+activityId);
|
}
|
|
private void autoEndActivity(String activityId){
|
log.info("autoEndActivity scheduler task is running :" + activityId);
|
remoteActivityService.endActivity(activityId);
|
//删除定时任务
|
remoteConfigService.deleteDelayTask(DelayTaskEnum.ACTIVITY_END_TASK.getCode()+"-"+activityId);
|
}
|
|
private void autoCancelOrder(String orderId){
|
log.info("autoCancelOrder scheduler task is running :" + orderId);
|
remoteOrderService.autoCancelOrder(orderId);
|
//删除定时任务
|
remoteConfigService.deleteDelayTask(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode()+"-"+orderId);
|
}
|
}
|