package com.*.server.live.listener;
import com.*.common.core.entity.constant.LiveConstant;
import com.*.common.redis.service.RedisService;
import com.*.server.live.core.recreation.LiveRecreation;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.messaging.support.GenericMessage;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ExecutorService;
/**
* 功能描述:自定义倒计时
* 作者:唐泽齐
*/
@Slf4j
@Service
@RequiredArgsConstructor
@RocketMQMessageListener(consumerGroup = TopConstant.STUDIO_RECREATION, topic = TopConstant.STUDIO_RECREATION)
public class StudioRecreationRocketMQListener implements RocketMQListener {
//rockteMQ延时 1s、 5s、 10s、 30s、 1m、 2m、 3m、 4m、 5m、 6m、 7m、 8m、 9m、 10m、 20m、 30m、 1h、 2h
final static private List<Long> delays = Arrays.asList(1l,5l,10l,30l,1*60l,2*60l,3*60l,4*60l,5*60l,6*60l,7*60l,8*60l,9*60l,10*60l,20*60l,30*60l,1*60*60l,2*60*60l);
final private RedisService redisService;
final RocketMQTemplate rocketMQTemplate;
final ExecutorService fixedThreadPool;
final LiveRecreation liveRecreation;
@Override
public void onMessage(Object message) {
log.info(LiveConstant.STUDIO_RECREATION+":"+message);
if(!redisService.hasKey(message.toString())) {
return;
}
//获取到期时间
Long expire = redisService.getExpire(message.toString());
//获取延时级别
int delay = getDelay(expire-5l);
//无需延时则立即执行
if(delay == 0) {
fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
liveRecreation.run(message.toString());
}
});
}
//需要延时则推送延时信息到MQ
else {
rocketMQTemplate.asyncSend(TopConstant.STUDIO_RECREATION, new GenericMessage<>(message.toString()), new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
log.info("Recreation===>delay::****未到时,继续等待====》"+message);
}
@SneakyThrows
@Override
public void onException(Throwable e) {
log.error("Recreation===>error::****计时异常,开始无限重试模式====》"+message,e);
onMessage(message);
}
},60l,delay);
}
}
/**
*
* 获取延时级别
* @return
*/
private Integer getDelay(Long delay) {
int level= 0;
//如果小于等于1秒则无需延时
if(delay>1l){
for (int i = 0; i < delays.size(); i++) {
if(delay<delays.get(i)) {
break;
}
level = i;
}
}
return level;
}
}