(监听Redis删除事件)抢单缓存超期就自动删除订单和账单

如果乘客下单之后,X信出现了闪退,然后过了半个小时,乘客重新登录小程序,因为数据库中存在没有接单的订单,小程序会跳转到create_order.vue页面,继续开始倒计时等待司机接单。由于抢单缓存早就销毁了,即使倒计时结束,发起AJAX请求关闭订单。但是业务层发现没有抢单缓存,那么可能就有司机接单了(实际上根本没有司机接单),又关闭不了订单。于是就僵持在这里了。

为了避免上面情况的发生,我们要用JAVA程序监听抢单缓存的销毁事件,赶紧把关联的订单和账单记录给删除掉。即使像上面那样,乘客半小时后登录小程序,因为没有订单了,所以乘客可以重新下单。

如何监听redis中订单缓存销毁事件:

订单子系统的config文件夹内

@Configuration
public class RedisConfiguration {

    @Resource
    private RedisConnectionFactory redisConnectionFactory;

    @Bean
    public ChannelTopic expiredTopic() {
        /*
         * 自定义Redis队列的名字,如果有缓存销毁,就自动往这个队列中发消息
         * 每个子系统有各自的Redis逻辑库,订单子系统不会监听到其他子系统缓存数据销毁
         */
        return new ChannelTopic("__keyevent@5__:expired");  
    }

    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer() {
        RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
        redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
        return redisMessageListenerContainer;
    }
}

 redis中自带消息队列功能,这个消息队列专门接受销毁过期消息事件的。

订单子系统的config文件夹内

@Slf4j
@Component
public class KeyExpiredListener extends KeyExpirationEventMessageListener {
    @Resource
    private OrderDao orderDao;

    @Resource
    private OrderBillDao orderBillDao;

    public KeyExpiredListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }

    @Override
    @Transactional
    public void onMessage(Message message, byte[] pattern) {
        //从消息队列中接收消息
        if (new String(message.getChannel()).equals("__keyevent@5__:expired")) {
            
            //反序列化Key,否则出现乱码
            JdkSerializationRedisSerializer serializer = new JdkSerializationRedisSerializer();
            String key = serializer.deserialize(message.getBody()).toString();
            
            if (key.contains("order#")) {
                long orderId = Long.parseLong(key.split("#")[1]);
                HashMap param = new HashMap() {{
                    put("orderId", orderId);
                }};
                int rows = orderDao.deleteUnAcceptOrder(param);
                if (rows == 1) {
                    log.info("删除了无人接单的订单:" + orderId);
                }
                rows = orderBillDao.deleteUnAcceptOrderBill(orderId);
                if (rows == 1) {
                    log.info("删除了无人接单的账单:" + orderId);
                }
            }
        }
        super.onMessage(message, pattern);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chengbo_eva

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值