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
6.执行成功截图