如何在Java中使用延迟队列(java,开发技术)

时间:2024-05-03 12:53:21 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

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

如何在Java中使用延迟队列

[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

如何在Java中使用延迟队列

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:如何在Java中使用延迟队列的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Android studio有哪些使用小技巧下一篇:

3 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18