検索
ホームページJava&#&チュートリアルSpringBoot が Redisson を統合して遅延キューを実装する方法

使用シナリオ

1. 注文は正常に行われましたが、30 分間支払いが行われませんでした。支払いタイムアウト,注文の自動キャンセル

#2. 注文受領,受領後7日以内は評価は行われません。注文はタイムアウトになり、評価されませんでした,システムのデフォルトでは肯定的なレビューが設定されています

#3。注文は正常に行われました,販売者は 5 分以内に注文を受け取りませんでした,注文はキャンセルされました

4.配信がタイムアウトしました xff0c;プッシュ テキスト メッセージ リマインダー

……

遅延が長く、リアルタイム パフォーマンスが低いシナリオの場合は、タスクを使用できます。定期的なポーリング処理を実行するようにスケジュールします。たとえば、:xxl-job

今日は、Redis の遅延キューを使用して処理する、比較的シンプルで軽量な方法を採用します。もちろん、より良いソリューションはあります。企業のテクノロジー選択とビジネス システムに基づいて最適なソリューションを選択できます。たとえば、メッセージ ミドルウェア Kafka と RabbitMQ の遅延キューを使用します。

その実装原理については説明しないで、実際のコードに直接進み、最初に Redis ベースの遅延キューを実装してみましょう

1。 Redisson の依存関係

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.10.5</version>
</dependency>

2.Nacos 構成 Redis 接続

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password: 123456
    database: 12
    timeout: 3000

3.RedissonConfig 構成の作成

/**
 * Created by LPB on 2020/04/20.
 */
@Configuration
public class RedissonConfig {

	@Value("${spring.redis.host}")
	private String host;
	@Value("${spring.redis.port}")
	private int port;
	@Value("${spring.redis.database}")
	private int database;
	@Value("${spring.redis.password}")
	private String password;

	@Bean
	public RedissonClient redissonClient() {
		Config config = new Config();
		config.useSingleServer()
			.setAddress("redis://" + host + ":" + port)
			.setDatabase(database)
			.setPassword(password);
		return Redisson.create(config);
	}

}

4.Redis 遅延キュー ツール クラスのカプセル化

/**
 * redis延迟队列工具
 * Created by LPB on 2021/04/20.
 */
@Slf4j
@Component
public class RedisDelayQueueUtil {

    @Autowired
	private RedissonClient redissonClient;

    /**
     * 添加延迟队列
     * @param value 队列值
     * @param delay 延迟时间
     * @param timeUnit 时间单位
     * @param queueCode 队列键
     * @param <T>
     */
    public <T> void addDelayQueue(T value, long delay, TimeUnit timeUnit, String queueCode){
        try {
            RBlockingDeque<Object> blockingDeque = redissonClient.getBlockingDeque(queueCode);
            RDelayedQueue<Object> delayedQueue = redissonClient.getDelayedQueue(blockingDeque);
            delayedQueue.offer(value, delay, timeUnit);
			log.info("(添加延时队列成功) 队列键&#xff1a;{}&#xff0c;队列值&#xff1a;{}&#xff0c;延迟时间&#xff1a;{}", queueCode, value, timeUnit.toSeconds(delay) + "秒");
        } catch (Exception e) {
            log.error("(添加延时队列失败) {}", e.getMessage());
            throw new RuntimeException("(添加延时队列失败)");
        }
    }

	/**
	 * 获取延迟队列
	 * @param queueCode
	 * @param <T>
	 * @return
	 * @throws InterruptedException
	 */
    public <T> T getDelayQueue(String queueCode) throws InterruptedException {
        RBlockingDeque<Map> blockingDeque = redissonClient.getBlockingDeque(queueCode);
        T value  = (T) blockingDeque.take();
        return value;
	}
}

5 . 遅延キュー ビジネス列挙体を作成します

/**
 * 延迟队列业务枚举
 * Created by LPB on 2021/04/20.
 */
@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum RedisDelayQueueEnum {

	ORDER_PAYMENT_TIMEOUT("ORDER_PAYMENT_TIMEOUT","订单支付超时&#xff0c;自动取消订单", "orderPaymentTimeout"),
	ORDER_TIMEOUT_NOT_EVALUATED("ORDER_TIMEOUT_NOT_EVALUATED", "订单超时未评价&#xff0c;系统默认好评", "orderTimeoutNotEvaluated");

	/**
	 * 延迟队列 Redis Key
	 */
	private String code;

	/**
	 * 中文描述
	 */
	private String name;

	/**
	 * 延迟队列具体业务实现的 Bean
	 * 可通过 Spring 的上下文获取
	 */
	private String beanId;

}

6. 遅延キュー エグゼキュータを定義します

/**
 * 延迟队列执行器
 * Created by LPB on 2021/04/20.
 */
public interface RedisDelayQueueHandle<T> {

	void execute(T t);

}

7. 列挙で定義された Bean, を作成し、遅延キュー エグゼキュータを実装します

    #OrderPaymentTimeout:注文支払いタイムアウト遅延キュー処理クラス
  • /**
     * 订单支付超时处理类
     * Created by LPB on 2021/04/20.
     */
    @Component
    @Slf4j
    public class OrderPaymentTimeout implements RedisDelayQueueHandle<Map> {
    	@Override
    	public void execute(Map map) {
    		log.info("(收到订单支付超时延迟消息) {}", map);
    		// TODO 订单支付超时&#xff0c;自动取消订单处理业务...
    
    	}
    }
    DelayQueueProcessorForUnevaluatedOrders: 未評価の注文を処理するための遅延キュー処理クラス、使用されます。注文がタイムアウトして評価されない場合
  • /**
     * 订单超时未评价处理类
     * Created by LPB on 2021/04/20.
     */
    @Component
    @Slf4j
    public class OrderTimeoutNotEvaluated implements RedisDelayQueueHandle<Map> {
    	@Override
    	public void execute(Map map) {
    		log.info("(收到订单超时未评价延迟消息) {}", map);
    		// TODO 订单超时未评价&#xff0c;系统默认好评处理业务...
    
    	}
    }
  • 8. 遅延キュー消費スレッドを作成します,プロジェクトの開始後に開始します
/**
 * 启动延迟队列
 * Created by LPB on 2021/04/20.
 */
@Slf4j
@Component
public class RedisDelayQueueRunner implements CommandLineRunner {

	@Autowired
	private RedisDelayQueueUtil redisDelayQueueUtil;

	@Override
	public void run(String... args) {
		new Thread(() -> {
			while (true){
				try {
					RedisDelayQueueEnum[] queueEnums = RedisDelayQueueEnum.values();
					for (RedisDelayQueueEnum queueEnum : queueEnums) {
						Object value = redisDelayQueueUtil.getDelayQueue(queueEnum.getCode());
						if (value != null) {
							RedisDelayQueueHandle redisDelayQueueHandle = SpringUtil.getBean(queueEnum.getBeanId());
							redisDelayQueueHandle.execute(value);
						}
					}
				} catch (InterruptedException e) {
					log.error("(Redis延迟队列异常中断) {}", e.getMessage());
				}
			}
		}).start();
		log.info("(Redis延迟队列启动成功)");
	}
}

上記の手順 ,Redis 遅延キューのコア コードが完成しました,テスト インターフェイスを作成しましょう,PostMan を使用してシミュレートし、テストします

#9. テスト インターフェイスを作成します,シミュレーション 遅延キューを追加します

/**
 * 延迟队列测试
 * Created by LPB on 2020/04/20.
 */
@RestController
public class RedisDelayQueueController {

	@Autowired
	private RedisDelayQueueUtil redisDelayQueueUtil;

	@PostMapping("/addQueue")
	public void addQueue() {
		Map<String, String> map1 = new HashMap<>();
		map1.put("orderId", "100");
		map1.put("remark", "订单支付超时&#xff0c;自动取消订单");

		Map<String, String> map2 = new HashMap<>();
		map2.put("orderId", "200");
		map2.put("remark", "订单超时未评价&#xff0c;系统默认好评");

		// 添加订单支付超时&#xff0c;自动取消订单延迟队列。为了测试效果&#xff0c;延迟10秒钟
		redisDelayQueueUtil.addDelayQueue(map1, 10, TimeUnit.SECONDS, RedisDelayQueueEnum.ORDER_PAYMENT_TIMEOUT.getCode());

		// 订单超时未评价&#xff0c;系统默认好评。为了测试效果&#xff0c;延迟20秒钟
		redisDelayQueueUtil.addDelayQueue(map2, 20, TimeUnit.SECONDS, RedisDelayQueueEnum.ORDER_TIMEOUT_NOT_EVALUATED.getCode());
	}

}

10. SpringBoot プロジェクトを開始します,PostMan 呼び出しインターフェイスを使用して遅延キューを追加します

    Redis クライアントを通じて確認できます2 つの遅延キューが正常に追加されたことを確認します。

SpringBoot が Redisson を統合して遅延キューを実装する方法

    IDEA コンソールのログを確認して、遅延キューが消費されたことを確認します。成功しました

以上がSpringBoot が Redisson を統合して遅延キューを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事は亿速云で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。