JobBuilder.newJob(clszz) .withIdentity 是什么用法?

问题一

这种带 . 的写法是什么意思?怎么理解

JobDetail senddatajobDetail = JobBuilder.newJob(clszz)
                    .withIdentity(new JobKey(clszz.getSimpleName(), collectorJobGroup)).storeDurably().build();
JobDetail collectorjobDetail = JobBuilder.newJob(clszz)
                    .withIdentity(new JobKey(clszz.getSimpleName(), collectorJobGroup)).storeDurably().build();

问题二

这种传递参数怎么理解?

public void startCollectorJob(Class<? extends CollectorJob> clszz,int intervalMin)

源码

private void addTrigger(String group, JobDetail jobDetail, String name,
            int intervaleMin) throws SchedulerException {
        TriggerKey triggerKey = new TriggerKey(name, group);
        boolean istriggerExists = scheduler.checkExists(triggerKey);
        if (istriggerExists) {
            removeTrigger(name, group);
        }
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity(triggerKey)
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatForever().withIntervalInMinutes(intervaleMin)).startNow()
                .forJob(jobDetail).build();
        scheduler.scheduleJob(trigger);
    }
    public void startCollectorJob(Class<? extends CollectorJob> clszz,int intervalMin){
        try {
            JobDetail collectorjobDetail = JobBuilder.newJob(clszz)
                    .withIdentity(new JobKey(clszz.getSimpleName(), collectorJobGroup)).storeDurably().build();
            scheduler.addJob(collectorjobDetail, true);
            addTrigger(clszz.getSimpleName(),collectorjobDetail, intervalMin);
        } catch (SchedulerException e) {
            log.error("start collector job error,jobname:{}",clszz.getName());
            log.error("start collector job error",e);
            e.printStackTrace();
        }
    }
    public void starSendDataJob(Class<? extends SendDataJob> clszz,int intervalMin,String topcic){
        try {
            JobDetail senddatajobDetail = JobBuilder.newJob(clszz)
                    .withIdentity(new JobKey(clszz.getSimpleName(), collectorJobGroup)).storeDurably().build();
            senddatajobDetail.getJobDataMap().put("topic", topcic);
            scheduler.addJob(senddatajobDetail, true);
            addTrigger(clszz.getSimpleName(),senddatajobDetail, intervalMin);
        } catch (SchedulerException e) {
            log.error("start send data job error,jobname:{}",clszz.getName());
            log.error("start send data job error",e);
            e.printStackTrace();
        }
    }
阅读 11.3k
1 个回答

问题一:

`javascript` 里叫链式调用,不知道 `java` 里具体叫啥。实现上其实就是方法里返回自己:
public class JobBuilder {
    
    public static JobBuilder newJob(...) {
        return new JobBuilder(...);
    }
    
    public JobBuilder withIdentity(...) {
        return this;
    }
    
}

具体到这个例子,是 java 里的构造器模式,可以做默认参数和按需调参。

问题二:

就是接受一个 **继承/实现了** `CollectorJob` (接口) 的类,这样这个包就可以自行去按需创建这个 `Job` 的实例,因为有时候任务类型的实例可能是个重量级对象,会希望延迟实例化,这样可以避免系统一启动就占用了过多内存;另外可能会需要对这个类进行一些实例化前的准备工作,比如扫描注解、创建代理等等;还有的情况就是 `Spring` 那样会进行一个类成员注入的操作。
推荐问题