1、 创建延时消息的实体类
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
public class DelayMessage implements Delayed {
private String message;
private long ttl;
public DelayMessage(String message,long ttl) {
setMessage(message);
this.ttl=System.currentTimeMillis()+ttl;
}
@Override
public long getDelay(TimeUnit unit) {
long remaining=ttl-System.currentTimeMillis();
return unit.convert(remaining,TimeUnit.MILLISECONDS);
}
@Override
public int compareTo(Delayed o) {
return (int)(this.getDelay(TimeUnit.MILLISECONDS)-o.getDelay(TimeUnit.MILLISECONDS));
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
2、延迟队列的消费者定义类
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.DelayQueue;
@Slf4j
public class DelayQueueConsumer implements Runnable{
private final DelayQueue<DelayMessage> delayQueue;
public DelayQueueConsumer(DelayQueue<DelayMessage> delayQueue){
this.delayQueue=delayQueue;
}
@Override
public void run() {
while(true){
try {
DelayMessage delayMessage=delayQueue.take();
log.info("消费延迟队列中的消息:{}",delayMessage.getMessage());
}catch (Exception e){
e.printStackTrace();
}
}
}
}
3、延迟队列的生产者消息对象
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.DelayQueue;
@Slf4j
public class DelayQueueProducer {
public static void main(String[] args) {
DelayQueue<DelayMessage> delayQueue=new DelayQueue<>();
new Thread(new DelayQueueConsumer(delayQueue)).start();
for (int i = 1; i <= 5; i++) {
DelayMessage delayMessage = new DelayMessage(String.valueOf(i), i*2000L);
log.info("生产延迟队列中的消息: {}", String.valueOf(i));
delayQueue.offer(delayMessage);
}
for (int i = 5; i > 0; i--) {
String message = String.valueOf(i);
DelayMessage delayMessage = new DelayMessage(message, i*1000L);
log.info("生产延迟队列中的消息: {}", message);
delayQueue.offer(delayMessage);
}
Random random = new Random();
for (int i = 0; i < 5; i++) {
int ttl = 1 + random.nextInt(10);
String message = String.valueOf(ttl);
DelayMessage delayMessage = new DelayMessage(message, ttl*1000L);
log.info("生产延迟队列中的消息: {}", message);
delayQueue.offer(delayMessage);
}
}
}
查看结果

