可配置更改的定时任务

任务是配置一个可以配置更改的定时任务用来跑批量任务进行统计。不能用集成的,只能用原生的quartZ的写法。

首先是定义实体类:

 
public class PushConfig extends BasePojo{
    /**
     *任务id
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    /**
     * 任务名
     */
    @Column(name = "task_name")
    private String taskName;
    /**
     * 任务间隔
     */
    @Column(name = "task_interval")
    private int taskInterval;
    /**
     * 任务间隔单位
     */
    private int unit;
    /**
     *创建人的id
     */
    private int createu;
    /**
     * 修改人
     */
    private String updateu;
    /**
     * 任务类型
     */
    @Column(name = "task_type")
    private int taskType;
    /**
     * 有效性
     */
    private int invalid;

    /**
     * 任务分组
     */
    @Column(name = "job_group")
    private String jobGroup;

    /**
     * 任务运行时间表达式
     * */
    @Column(name = "cron_expression")
    private String cronexpression;
    /** 任务描述 */
    private String description;
//定时任务post的url
    private String url;

//    定时任务的执行类
    public String className;
//定时器触发器名和触发器组名(暂时未用到,用于分组,暂时和任务名,任务组一致)
   private String triggerName;
   private String triggerGroupName;

.....

 

定义过实体类之后,就可以将这个定时任务通过数据库的方式进行持久化存储。然后新建一个job的管理类来对定时任务进行一个集中式的管理:

 

  public static void addJob(PushConfig pushConfig) {
        try {
            Scheduler sched = schedulerFactory.getScheduler();
            // 任务名,任务组,任务执行类
            String className = pushConfig.getClassName();
            JobDetail jobDetail=null; // 触发器
            TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
            // 触发器名,触发器组
            triggerBuilder.withIdentity(pushConfig.getTriggerName(), pushConfig.getTriggerGroupName());
            triggerBuilder.startNow();
            // 触发器时间设定
            triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(pushConfig.getCronexpression()));
            // 创建Trigger对象
                CronTrigger trigger = (CronTrigger) triggerBuilder.build();
        if ("gpsPushJob".equals(className)) {
        jobDetail = JobBuilder.newJob(GpsPushJob.class).withIdentity(pushConfig.getTaskName(), pushConfig.getJobGroup()).build();
            }

// 调度容器设置JobDetail和Trigger jobDetail.getJobDataMap().put("creatuId",pushConfig.getCreateu()); jobDetail.getJobDataMap().put("url",pushConfig.getUrl()); sched.scheduleJob(jobDetail, trigger); // 启动 if (!sched.isShutdown()) { sched.start(); } }catch (ObjectAlreadyExistsException e1){ return; } catch (Exception e) { throw new RuntimeException(e); } }

需要注意的是,为了保证数据库中的字段用户等便于存储,我在这个定时任务中引入了jobdetail,这个jobdetail的主要作用是存放一些临时的例如这个客户的名字,这个客户的要求(主动或被动推送等),这个要求会在下边的任务的进行过程中体现。主要是为了记录这个任务的成功失败客户等信息。

接下来就可以在要写的job中进行一个逻辑的书写,如下

@Component
public class GpsPushJob extends LoadJob implements Job {

    @Autowired
    private IGpsService gpsService;
    @Autowired
    private IVehicleService vehicleService;

    @Autowired
    private IRedisClientService redisClientService;

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
//这里添加一个时间的逻辑,目的是为了灵活调用时间,取消写死的时间的设置,用了redis暂时存储
//        key的名称是id_url,value是时间
        JobDetail jobDetail = jobExecutionContext.getJobDetail();
        Integer creatuId = (Integer) jobDetail.getJobDataMap().get("creatuId");
        String url = (String) jobDetail.getJobDataMap().get("url");
        boolean b = this.redisClientService.existsKey(0, creatuId + "_" + url+"_GPS");
        if(b==false){
            DateTime dateTime = new DateTime();
          redisClientService.put(1,creatuId + "_" + url+"_GPS",dateTime.toString(FormateConstant.getDateString));
        }
        List<GpsInfo> gps = this.gpsService.queryGps(LoadJob.departments, LoadJob.vehicles,creatuId, url);
        ObjectMapper mapper = new ObjectMapper();
        try {
            String s = mapper.writeValueAsString(gps);
            JsonResponse aTrue = new JsonResponse(true, "", s);
            System.out.println("aTrue "+aTrue.toString());
//            postDate(s,url);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            JsonResponse aTrue = new JsonResponse(false, "服务器错误", "");
        }

    }

我们可以看到,这里的逻辑是将用户url等做了一个记录,并且在其他地方将用户要的信息发送给用户。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值