Rumah  >  Artikel  >  Java  >  Bagaimana SpringBoot menyepadukan Redisson untuk melaksanakan baris gilir kelewatan

Bagaimana SpringBoot menyepadukan Redisson untuk melaksanakan baris gilir kelewatan

王林
王林ke hadapan
2023-05-30 14:40:141649semak imbas

Senario Penggunaan

1. Pesanan telah berjaya dibuat dan tiada pembayaran dibuat dalam masa 30 minit. Tamat masa pembayaran,Pembatalan automatik pesanan

2. Resit pesanan,Tiada penilaian akan dijalankan dalam tempoh 7 hari selepas penerimaan. Pesanan telah tamat masa dan tidak dinilai,Sistem gagal menerima ulasan positif

3 Pesanan telah dibuat dengan jayanya,Peniaga tidak menerima pesanan selama 5 minit,Pesanan telah dibatalkan.

4. Masa penghantaran tamat xff0c;Peringatan mesej teks tolak

...

Untuk senario dengan kelewatan yang lama dan prestasi masa nyata yang rendah, kami boleh menggunakan tugasan penjadualan untuk memproses pengundian secara berkala. Contohnya, :xxl-job

Hari ini kami menggunakan kaedah yang agak mudah dan ringan-menggunakan baris gilir kelewatan Redis untuk pemprosesan. Sudah tentu terdapat penyelesaian yang lebih baik - anda boleh memilih penyelesaian yang optimum berdasarkan pemilihan teknologi dan sistem perniagaan syarikat. Sebagai contoh, gunakan baris gilir kelewatan mesej Kafka dan RabbitMQ

tanpa membincangkan prinsip pelaksanaannya Mari kita pergi terus ke kod sebenar dan mula-mula melaksanakan baris gilir kelewatan berasaskan Redis

1 pergantungan

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

2. Konfigurasi Nacos Sambungan Redis

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

3 Cipta konfigurasi 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. Cipta penghitungan perniagaan baris gilir kelewatan

/**
 * 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;
	}
}

6. Takrifkan pelaksana baris gilir kelewatan

/**
 * 延迟队列业务枚举
 * 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;

}

7. Cipta Bean yang ditakrifkan dalam penghitungan dan laksanakan pelaksana baris gilir kelewatan

    OrderPaymentTimeout" keluar dan tidak dinilai
  • /**
     * 延迟队列执行器
     * Created by LPB on 2021/04/20.
     */
    public interface RedisDelayQueueHandle<T> {
    
    	void execute(T t);
    
    }
  • 8. Cipta benang penggunaan barisan kelewatan, #xff0c;Kod teras baris gilir kelewatan Redis telah selesai,Mari kita tulis antara muka ujian,Gunakan simulasi PostMan untuk mengujinya
  • 9 Cipta antara muka ujian,Simulasi Tambah kelewatan beratur

    /**
     * 订单支付超时处理类
     * 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;自动取消订单处理业务...
    
    	}
    }

    10 Mulakan projek SpringBoot,Gunakan antara muka panggilan PostMan untuk menambah baris gilir kelewatan

Anda boleh melihat melalui klien Redis bahawa kedua-dua kelewatan. baris gilir telah berjaya Ditambah

    Melihat log konsol IDEA, anda dapat melihat bahawa baris gilir kelewatan telah berjaya digunakan

Atas ialah kandungan terperinci Bagaimana SpringBoot menyepadukan Redisson untuk melaksanakan baris gilir kelewatan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam