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
<dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.10.5</version> </dependency>
spring: redis: host: 127.0.0.1 port: 6379 password: 123456 database: 12 timeout: 3000
/** * 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); } }
/** * 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("(添加延时队列成功) 队列键:{},队列值:{},延迟时间:{}", 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; } }
/** * 延迟队列业务枚举 * Created by LPB on 2021/04/20. */ @Getter @NoArgsConstructor @AllArgsConstructor public enum RedisDelayQueueEnum { ORDER_PAYMENT_TIMEOUT("ORDER_PAYMENT_TIMEOUT","订单支付超时,自动取消订单", "orderPaymentTimeout"), ORDER_TIMEOUT_NOT_EVALUATED("ORDER_TIMEOUT_NOT_EVALUATED", "订单超时未评价,系统默认好评", "orderTimeoutNotEvaluated"); /** * 延迟队列 Redis Key */ private String code; /** * 中文描述 */ private String name; /** * 延迟队列具体业务实现的 Bean * 可通过 Spring 的上下文获取 */ private String beanId; }
/** * 延迟队列执行器 * Created by LPB on 2021/04/20. */ public interface RedisDelayQueueHandle<T> { void execute(T t); }
/** * 订单支付超时处理类 * 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 订单支付超时,自动取消订单处理业务... } }
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!