Redis监听失效的字段

1.创建ApplicationContext对象

package com.cloud.drore.eboss.dealer.util;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * 
 *
 * @Description: <br>
 * @Project: eboos <br>
 * @CreateDate: Created in 2018/2/28 20:44 <br>
 * @Author: <a href="410508961@qq.com">夏凯</a>
 */
@Component
public class ApplicationContextUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext = null;
    // 非@import显式注入,@Component是必须的,且该类必须与main同包或子包
    // 若非同包或子包,则需手动import 注入,有没有@Component都一样
    // 可复制到Test同包测试

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (ApplicationContextUtil.applicationContext == null) {
            ApplicationContextUtil.applicationContext = applicationContext;
        }
        System.out.println("---------------com.ilex.jiutou.util.Test.Main.SubPackage.SpringUtil---------------");
    }

    //获取applicationContext
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    //通过name获取 Bean.
    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);

    }

    //通过class获取Bean.
    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    //通过name,以及Clazz返回指定的Bean
    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }
}

2.项目启动后开启redis的监听

package com.cloud.drore.eboss.config;

import com.cloud.drore.eboss.dealer.util.ApplicationContextUtil;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

/**
 * 
 *
 * @Description: 项目启动后,开启监听Redis到期的类<br>
 * @Project: eboos <br>
 * @CreateDate: Created in 2018/3/16 10:21 <br>
 * @Author: <a href="747639122@qq.com">冯腾</a>
 */
@Component
public class MyApplicationRunner implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments applicationArguments) {
        JedisPoll jedisPoll = ApplicationContextUtil.getBean(JedisPoll.class);
        JedisPool jedisPool = jedisPoll.redisPoolFactory();
        Jedis jedis = jedisPool.getResource();
        jedis.psubscribe(new KeyExpiredListener(), "__key*__:*");
        System.out.println("MyApplicationRunner class will be execute when the project was started!");
    }
}

3.得到redisPool

package com.cloud.drore.eboss.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * 
 *
 * @Description: 得到redisPool<br>
 * @Project: eboos <br>
 * @CreateDate: Created in 2018/3/15 18:44 <br>
 * @Author: <a href="410508961@qq.com">夏凯</a>
 */
@Configuration
public class JedisPoll {

    @Autowired
    RedisProperties redisProperties;

    @Bean
    public JedisPool redisPoolFactory() {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(redisProperties.getPool().getMaxIdle());
        jedisPoolConfig.setMaxWaitMillis(redisProperties.getPool().getMaxWait());


        JedisPool jedisPool = new JedisPool(jedisPoolConfig, redisProperties.getHost(), redisProperties.getPort(), redisProperties.getTimeout());

        return jedisPool;
    }
}

4.执行redis监听到期后的业务

package com.cloud.drore.eboss.config;

import com.cloud.drore.eboos.common.entity.dealer.Order;
import com.cloud.drore.eboss.dealer.entity.OrderOperationRecord;
import com.cloud.drore.eboss.dealer.util.ApplicationContextUtil;
import com.cloud.drore.eboss.factory.mapper.FactoryOrderMapper;
import com.cloud.drore.eboss.factory.mapper.FactoryOrderOperationRecordMapper;
import com.cloud.drore.eboss.factory.mapper.FactoryOrderProductMapper;
import redis.clients.jedis.JedisPubSub;

import java.math.BigDecimal;
import java.util.Date;


/**
 * 
 *
 * @Description: 执行Redis监听和到期的类<br>
 * @Project: eboos <br>
 * @CreateDate: Created in 2018/3/15 19:07 <br>
 * @Author: 410508961@qq.com
 */
public class KeyExpiredListener extends JedisPubSub {

    @Override
    public void onPSubscribe(String pattern, int subscribedChannels) {
        System.out.println("onPSubscribe " + pattern + " " + subscribedChannels);
    }

    @Override
    public void onPMessage(String pattern, String channel, String orderNum) {
        System.out.println("onPMessage pattern " + pattern + " " + channel + " " + orderNum);


        // 得到factoryOrderMapper
        FactoryOrderMapper factoryOrderMapper = ApplicationContextUtil.getBean(FactoryOrderMapper.class);
        Order order = factoryOrderMapper.findOrderByOrderNum(orderNum);
        // 如果订单状态为预订失败,待支付或者出票失败时
        if (order.getOrderStatus() ==2 || order.getOrderStatus() == 4 || order.getOrderStatus() == 6){

            order.setOrderStatus(3);
            // 更新订单主表状态
            factoryOrderMapper.updateByPrimaryKey(order);

            // 得到factoryOrderProductMapper
            FactoryOrderProductMapper factoryOrderProductMapper
                    = ApplicationContextUtil.getBean(FactoryOrderProductMapper.class);
            // 更新订单子表状态
            factoryOrderProductMapper.updateByOrderNum(orderNum,order.getOrderStatus());
            // 增加订单记录
            FactoryOrderOperationRecordMapper factoryOrderOperationRecordMapper = ApplicationContextUtil.getBean(FactoryOrderOperationRecordMapper.class);
            OrderOperationRecord orderOperationRecord = new OrderOperationRecord();
            orderOperationRecord.setOrderId(order.getId());
            orderOperationRecord.setOperationDate(new Date());
            orderOperationRecord.setShouldPayment(order.getTotalPrice());
            orderOperationRecord.setActuallyPayment(new BigDecimal(0));
            orderOperationRecord.setShouldRefund(new BigDecimal(0));
            orderOperationRecord.setActuallyRefund(new BigDecimal(0));
            orderOperationRecord.setCurrentStatus(order.getOrderStatus());
            factoryOrderOperationRecordMapper.insert(orderOperationRecord);
        }

    }

}

5.项目相关demo

git相关链接

6.执行成功截图


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值