elastic-job静态页定时删除

74 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第28天,点击查看活动详情

每日英语:

True beauty is what you see with the eyes of love.

翻译:用爱的眼睛才能看到真正的美。 ——特德·姜

静态页定时删除

我们开始实现静态页动态删除操作。静态页动态删除我们需要根据活动ID查询所有商品详情,然后根据商品详情删除即可。

查询商品详情

1)Service

接口:修改mall-seckill-servicecom.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-servicecom.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容器获取,作业实现。