Network Security Internet Technology Development Database Servers Mobile Phone Android Software Apple Software Computer Software News IT Information

In addition to Weibo, there is also WeChat

Please pay attention

WeChat public account

Shulou

How to implement delay queue in Java

2025-04-07 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Development >

Share

Shulou(Shulou.com)06/01 Report--

The editor will share with you how to implement the delay queue in Java. I hope you will get something after reading this article. Let's discuss it together.

The common implementation methods are: scheduled task scanning, RocketMQ delay queue, Java automatic delay queue, monitoring Redis Key expiration and so on.

1. DelayQueue

First, define a deferred task

Package com.cjs.example;import lombok.Data;import java.util.concurrent.Delayed;import java.util.concurrent.TimeUnit;/** * @ author ChengJianSheng * @ since 2021-3-18 * / @ Datapublic class DelayTask implements Delayed {private Long orderId; private long expireTime; public DelayTask (Long orderId, long expireTime) {this.orderId = orderId; this.expireTime = expireTime;} @ Override public long getDelay (TimeUnit unit) {return expireTime-System.currentTimeMillis () @ Override public int compareTo (Delayed o) {return (int) (getDelay (TimeUnit.MILLISECONDS)-o.getDelay (TimeUnit.MILLISECONDS));}}

Then, define a management class

Package com.cjs.example;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.CommandLineRunner;import org.springframework.stereotype.Component;import java.util.concurrent.DelayQueue;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * @ author ChengJianSheng * @ since 2021-3-19 * / @ Slf4j@Componentpublic class DelayQueueManager implements CommandLineRunner {private DelayQueue queue = new DelayQueue (); @ Autowired private ParkOrderQueryHandler handler; @ Override public void run (String...) Strings) throws Exception {ExecutorService executorService = Executors.newSingleThreadExecutor (); executorService.execute (new Runnable () {@ Override public void run () {while (true) {try {DelayTask task = queue.take (); handler.handle (task);} catch (InterruptedException e) {e.printStackTrace ();});} public void put (DelayTask task) {queue.put (task);}

Insert task

@ Slf4j@Servicepublic class PayServiceImpl implements PayService {@ Autowired private DelayQueueManager delayQueueManager; @ Override public void pay () {delayQueueManager.put (new DelayTask (1,15)); delayQueueManager.put (new DelayTask (2,30)); delayQueueManager.put (new DelayTask (3,60));} 2. Redis Key expiration callback

Modify the redis.conf file

# bind 127.0.0.1 -:: 1

Protected-mode no

Notify-keyspace-events Ex

[root@localhost redis-6.2.1] $src/redis-server redis.conf 4.0.0 org.springframework.boot spring-boot-starter-parent 2.4.4 com.example demo0401 0.0.1-SNAPSHOT demo0401 Demo project for Spring Boot 1.8 org.springframework.boot spring-boot-starter-data-redis org.springframework.boot spring-boot-maven-plugin

RedisConfig.java

Package com.example.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.listener.RedisMessageListenerContainer;/** * @ author ChengJianSheng * @ since 2021-4-2 * / @ Configurationpublic class RedisConfig {@ Bean public RedisMessageListenerContainer container (RedisConnectionFactory connectionFactory) {RedisMessageListenerContainer container = new RedisMessageListenerContainer (); container.setConnectionFactory (connectionFactory); return container;}}

Create a listener class

Package com.example.listener;import org.springframework.data.redis.connection.Message;import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;import org.springframework.data.redis.listener.RedisMessageListenerContainer;import org.springframework.stereotype.Component;/** * @ author ChengJianSheng * @ since 2021-4-2 * / @ Componentpublic class MyRedisKeyExpirationListener extends KeyExpirationEventMessageListener {public MyRedisKeyExpirationListener (RedisMessageListenerContainer listenerContainer) {super (listenerContainer);} @ Override public void onMessage (Message message, byte [] pattern) {String expiredKey = message.toString () System.out.println ("listening to Key:" + expiredKey + "expired");}} after reading this article, I believe you have some understanding of "how to implement delay queue in Java". If you want to know more about it, welcome to follow the industry information channel. Thank you for reading!

Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.

Views: 0

*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.

Share To

Development

Wechat

© 2024 shulou.com SLNews company. All rights reserved.

12
Report