持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第28天,点击查看活动详情
每日英语:
True beauty is what you see with the eyes of love.
翻译:用爱的眼睛才能看到真正的美。 ——特德·姜
静态页定时删除
我们开始实现静态页动态删除操作。静态页动态删除我们需要根据活动ID查询所有商品详情,然后根据商品详情删除即可。
查询商品详情
1)Service
接口:修改mall-seckill-service的com.xz.mall.seckill.service.SeckillGoodsService增加根据活动ID查询商品列表方法:
public interface SeckillGoodsService extends IService<SeckillGoods> {
//根据活动ID查询商品信息
List<SeckillGoods> actGoods(String acid);
}
实现类:修改com.xz.mall.seckill.service.impl.SeckillGoodsServiceImpl增加根据活动ID查询商品列表实现方法:
@Service
public class SeckillGoodsServiceImpl extends ServiceImpl<SeckillGoodsMapper,SeckillGoods> implements SeckillGoodsService {
@Autowired
private SeckillGoodsMapper seckillGoodsMapper;
//根据活动ID查询商品信息
@Override
public List<SeckillGoods> actGoods(String acid) {
QueryWrapper<SeckillGoods> seckillGoodsQueryWrapper = new QueryWrapper<SeckillGoods>();
seckillGoodsQueryWrapper.eq("activity_id",acid);
return seckillGoodsMapper.selectList(seckillGoodsQueryWrapper);
}
}
2)Controller
修改mall-seckill-service的com.xz.mall.seckill.controller.SeckillGoodsController创建查询方法:
/***
* 根据活动查询秒杀商品集合
* @param acid
* @return
*/
@GetMapping(value = "/act/{acid}")
public RespResult<List<SeckillGoods>> actGoods(@PathVariable("acid") String acid){
List<SeckillGoods> seckillGoods = seckillGoodsService.actGoods(acid);
return RespResult.ok(seckillGoods);
}
3)Feign接口
在mall-seckill-api中修改com.xz.mall.seckill.feign.SeckillGoodsFeign添加接口查询方法:
/***
* 根据活动查询秒杀商品集合
* @param acid
* @return
*/
@GetMapping(value = "/seckill/goods/act/{acid}")
RespResult<List<SeckillGoods>> actGoods(@PathVariable("acid") String acid);
Spring容器获取
在动态定时任务作业中,由于作业对象没有交给Spring容器管理,无法使用注入注解,需要从Spring容器中手动获取,因此我们可以创建一个类com.xz.canal.spring.SpringContext获取容器对象:
@Component
public class SpringContext implements ApplicationContextAware {
private static ApplicationContext act;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
act = applicationContext;
}
public static <T>T getBean(Class clazz){
return act.getBean((Class<T>) clazz);
}
}
作业实现
创建作业对象,实现删除静态页操作,同时作为定时任务作业,在Canal监听的时候执行调用,代码如下:
public class DynamicJob implements SimpleJob {
//执行的作业
@Override
public void execute(ShardingContext shardingContext) {
//静态页删除
delete(shardingContext.getJobParameter());
}
/***
* 执行静态页删除
*/
public void delete(String acid){
//从容器中获取指定的实例
SeckillPageFeign seckillPageFeign = SpringContext.getBean(SeckillPageFeign.class);
seckillPageFeign.deleByAct(acid);
}
}
创建Canal监听类com.xz.canal.listener.SeckillActivityHandler实现对活动的监听,活动发生变更时,执行动态创建定时任务删除静态页,代码如下:
@Component
@CanalTable(value = "seckill_activity")
public class SeckillActivityHandler implements EntryHandler<SeckillActivity> {
@Autowired
private DynamicTaskCreate dynamicTaskCreate;
/****
* 增加活动
* @param seckillActivity
*/
@Override
public void insert(SeckillActivity seckillActivity) {
//创建任务调度,活动结束的时候执行
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("ss mm HH dd MM ? yyyy");
String cron = simpleDateFormat.format(seckillActivity.getEndTime());
dynamicTaskCreate.create(seckillActivity.getId(), cron, 1, new DynamicJob(),seckillActivity.getId());
}
@Override
public void update(SeckillActivity before, SeckillActivity after) {
//创建任务调度,活动结束的时候执行
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("ss mm HH dd MM ? yyyy");
String cron = simpleDateFormat.format(after.getEndTime());
dynamicTaskCreate.create(after.getId(), cron, 1, new DynamicJob(),after.getId());
}
@Override
public void delete(SeckillActivity seckillActivity) {
}
}
总结
本篇主要介绍了一下elastic-job处理静态页定时删除,查询商品详情,Spring容器获取,作业实现。