比如,A用户的一个队列,需要在10分钟后触发,B用户进来则需要20分钟后触发,现在只有一个MQ,如何实现呢??
疑问,A10分钟,B20分钟C30分钟依次类推?如果是那你需要累计时间
public void delayMsgTwo(String exchange, String routingKey, Object msg) {
delayMsgTwoTemplate.convertAndSend(exchange, routingKey, msg, new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
message.getMessageProperties().setExpiration(60*1000);
return message;
}
});
}
@Service
public class ExpireServiceByRedis implements ExpireService {
AtomicInteger atomicInteger = new AtomicInteger();
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Override
public void setExpireWorkOrder(String msg, Long sec, TimeUnit timeUnit) {
int i = atomicInteger.incrementAndGet();
// 数据类型可以换成其他类型
stringRedisTemplate.opsForValue().set(RedisKey.EXP+ i, msg, sec, timeUnit);
stringRedisTemplate.opsForValue().set(RedisKey.EXP_COPY+ i, msg);
}
}
@Service
public class RemindListenerService extends KeyExpirationEventMessageListener {
public static final String REDIS_SPLIT_KEY = ":";
@Autowired
private StringRedisTemplate stringRedisTemplate;
public RemindListenerService(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Override
public void onMessage(Message message, byte[] pattern) {
// 失效 key
String expiredKey = message.toString();
String[] split = expiredKey.split(REDIS_SPLIT_KEY);
String rk = split[0] + REDIS_SPLIT_KEY;
if (rk.equalsIgnoreCase(RedisKey.EXP)) {
String value = stringRedisTemplate.opsForValue().get(RedisKey.EXP_COPY + split[1]);
System.out.println("过期key " + expiredKey + " value " + value);
}
}
}
2 回答816 阅读
1 回答850 阅读
1 回答697 阅读
a和b进来都十分钟后作处理,检测到是b的时候,再把b以a的形式插入一遍就好了。就是打印一个tag