package com.itsoft.hotel.configuration.redis; import com.itsoft.framework.core.user.UserHelper; import com.itsoft.hotel.configuration.mybatisplus.DynamicDataSourceContextHolder; import com.itsoft.hotel.entity.ManagerHotelOrderVO; import com.itsoft.hotel.service.HotelLogService; import com.itsoft.hotel.service.ManagerHotelOrderService; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; 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; import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; import java.util.List; import static com.itsoft.hotel.commons.utils.Constant.*; /** * 主要作用就是:接收过期的redis消息,获取到key,key就是订单号,然后去更新订单号的状态 */ @Transactional @Component public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener { @Autowired private ManagerHotelOrderService managerHotelOrderService; @Autowired private HotelLogService hotelLogService; public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) { super(listenerContainer); } @Override public void onMessage(Message message, byte[] pattern) { String orderCode = message.toString(); if (!StringUtils.isBlank(orderCode)) { if (orderCode.startsWith(ORDER_HOTEL_RETURN)) { try { List<String> list = Arrays.asList(orderCode.split("_")); DynamicDataSourceContextHolder .setDataSourceKey(list.get(2)); ManagerHotelOrderVO orderInfo = managerHotelOrderService.getById(list.get(3)); if (orderInfo.getStatus() == 0) { //处于未支付状态 orderInfo.setStatus(4);//取消订单 managerHotelOrderService.updateById(orderInfo); //添加日志 hotelLogService.addLog(orderInfo.getId(), ITSOFT_AUTO, CANCEL_ORDER, ITSOFT_NAME, ITSOFT_AUTO_CONTENT); } } catch (Exception ex) { throw ex; } finally { DynamicDataSourceContextHolder.clearDataSourceKey(); } } } } }
package com.itsoft.hotel.configuration.redis; 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; /** * 注册redisTemplate,作为消息队列的发布者 */ @Configuration public class RedisListenerConfig { @Bean public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); return container; } }