如何在Java中使用延迟队列
导读:本文共2808.5字符,通常情况下阅读需要9分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 1. DelayQueue首先,定义一个延迟任务packagecom.cjs.example;importlombok.Data;importjava.util.concurrent.Delayed;importjava.util.concurrent.TimeUnit;/***@authorChengJianSheng*@since2021/... ...
音频解说
目录
(为您整理了一些要点),点击可以直达。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+"已过期");}}
3. RocketMQ
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:
如何在Java中使用延迟队列的详细内容,希望对您有所帮助,信息来源于网络。