如何实现Java中的延迟队列
小编给大家分享一下如何实现Java中的延迟队列,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
常见的实现方法主要有:定时任务扫描、RocketMQ延迟队列、Java自动的延迟队列、监听Redis Key过期等等
1. DelayQueue首先,定义一个延迟任务
packagecom.cjs.example;importlombok.Data;importjava.util.concurrent.Delayed;importjava.util.concurrent.TimeUnit;/***@authorChengJianSheng*@since2021/3/18*/@DatapublicclassDelayTaskimplementsDelayed{privateLongorderId;privatelongexpireTime;publicDelayTask(LongorderId,longexpireTime){this.orderId=orderId;this.expireTime=expireTime;}@OverridepubliclonggetDelay(TimeUnitunit){returnexpireTime-System.currentTimeMillis();}@OverridepublicintcompareTo(Delayedo){return(int)(getDelay(TimeUnit.MILLISECONDS)-o.getDelay(TimeUnit.MILLISECONDS));}}
然后,定义一个管理类
packagecom.cjs.example;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.CommandLineRunner;importorg.springframework.stereotype.Component;importjava.util.concurrent.DelayQueue;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;/***@authorChengJianSheng*@since2021/3/19*/@Slf4j@ComponentpublicclassDelayQueueManagerimplementsCommandLineRunner{privateDelayQueue<DelayTask>queue=newDelayQueue<>();@AutowiredprivateParkOrderQueryHandlerhandler;@Overridepublicvoidrun(String...strings)throwsException{ExecutorServiceexecutorService=Executors.newSingleThreadExecutor();executorService.execute(newRunnable(){@Overridepublicvoidrun(){while(true){try{DelayTasktask=queue.take();handler.handle(task);}catch(InterruptedExceptione){e.printStackTrace();}}}});}publicvoidput(DelayTasktask){queue.put(task);}}
插入任务
@Slf4j@ServicepublicclassPayServiceImplimplementsPayService{@AutowiredprivateDelayQueueManagerdelayQueueManager;@Overridepublicvoidpay(){delayQueueManager.put(newDelayTask(1,15));delayQueueManager.put(newDelayTask(2,30));delayQueueManager.put(newDelayTask(3,60));}}2. Redis Key过期回调
修改redis.conf文件
# bind 127.0.0.1 -::1
protected-mode no
notify-keyspace-events Ex
[root@localhostredis-6.2.1]$src/redis-serverredis.conf<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.4</version><relativePath/><!--lookupparentfromrepository--></parent><groupId>com.example</groupId><artifactId>demo0401</artifactId><version>0.0.1-SNAPSHOT</version><name>demo0401</name><description>DemoprojectforSpringBoot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
RedisConfig.java
packagecom.example.config;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.data.redis.connection.RedisConnectionFactory;importorg.springframework.data.redis.listener.RedisMessageListenerContainer;/***@authorChengJianSheng*@since2021/4/2*/@ConfigurationpublicclassRedisConfig{@BeanpublicRedisMessageListenerContainercontainer(RedisConnectionFactoryconnectionFactory){RedisMessageListenerContainercontainer=newRedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);returncontainer;}}
创建一个监听类
packagecom.example.listener;importorg.springframework.data.redis.connection.Message;importorg.springframework.data.redis.listener.KeyExpirationEventMessageListener;importorg.springframework.data.redis.listener.RedisMessageListenerContainer;importorg.springframework.stereotype.Component;/***@authorChengJianSheng*@since2021/4/2*/@ComponentpublicclassMyRedisKeyExpirationListenerextendsKeyExpirationEventMessageListener{publicMyRedisKeyExpirationListener(RedisMessageListenerContainerlistenerContainer){super(listenerContainer);}@OverridepublicvoidonMessage(Messagemessage,byte[]pattern){StringexpiredKey=message.toString();System.out.println("监听到Key:"+expiredKey+"已过期");}}
看完了这篇文章,相信你对“如何实现Java中的延迟队列”有了一定的了解,如果想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。