Quartz与Guice集成 Job如何自动注入Guice容器托管的对象

  • 添加自定义类实现JobFactory接口(参考了org.springframework.scheduling.quartz.AdaptableJobFactory类)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51

    import extensions.InjectorInstance;
    import org.quartz.Job;
    import org.quartz.Scheduler;
    import org.quartz.SchedulerException;
    import org.quartz.spi.JobFactory;
    import org.quartz.spi.TriggerFiredBundle;
    import org.springframework.util.ReflectionUtils;

    import java.lang.reflect.Method;

    /**
    * @author longhuashen
    * @since 2017/9/20
    */

    public class GuiceQuartzAdaptableJobFactory implements JobFactory {

    @Override
    public Job newJob(TriggerFiredBundle triggerFiredBundle, Scheduler scheduler) throws SchedulerException {
    try {
    Object jobObject = createJobInstance(triggerFiredBundle);
    return adaptJob(jobObject);
    }
    catch (Exception ex) {
    throw new SchedulerException("Job instantiation failed", ex);
    }
    }

    protected Job adaptJob(Object jobObject) throws Exception {
    if (jobObject instanceof Job) {
    return (Job) jobObject;
    }
    else {
    throw new IllegalArgumentException("Unable to execute job class [" + jobObject.getClass().getName() +
    "]: only [org.quartz.Job] and [java.lang.Runnable] supported.");
    }
    }

    protected Object createJobInstance(TriggerFiredBundle triggerFiredBundle) throws Exception {
    //调用父类的方法
    Method getJobDetail = triggerFiredBundle.getClass().getMethod("getJobDetail");
    Object jobDetail = ReflectionUtils.invokeMethod(getJobDetail, triggerFiredBundle);
    Method getJobClass = jobDetail.getClass().getMethod("getJobClass");
    Class jobClass = (Class) ReflectionUtils.invokeMethod(getJobClass, jobDetail);
    Object jobInstance = jobClass.newInstance();

    //InjectorInstance.injector是获取到Guice Injector对象
    InjectorInstance.injector.injectMembers(jobInstance);
    return jobInstance;
    }
    }
  • 注入自定义Factory

1
2
3
4
5
6
7
8
9
@Override
public Module getModule(IApplication arg0) {
return new AbstractModule() {
@Override
protected void configure() {
bind(GuiceQuartzAdaptableJobFactory.class);
}
};
}
  • 在自定义Job里注入Guice里的bean
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    import com.google.inject.Inject;

    /**
    * @author longhuashen
    * @since 2017/9/20
    */

    public class InventoryWarnJob implements Job {

    @Inject
    private InventoryWarnConfigMapper inventoryWarnConfigMapper;
    }