【问题标题】:Dependency Injection is not working on Quartz Job scheduled class依赖注入不适用于 Quartz Job 计划类
【发布时间】:2017-05-24 16:09:50
【问题描述】:

我正在尝试在 dropwizard 应用程序中使用 Quartz 作业调度程序来安排作业。在实现 Quartz Job 接口的类中,我注入了一些我的服务类来使用它的方法。但它没有被注入,该对象为空。请有人帮助我吗?

JobManagerImpl 类

public class MyJobManagerImpl {

private SchedulerFactory schedulerFactory;
private Scheduler scheduler;
private static final String group = "REFRESH";
private static final Logger logger = LoggerFactory.getLogger(TcConnectionRefreshJobManagerImpl.class);

public MyJobManagerImpl(Properties quartzConfig) {
    try {
        schedulerFactory = new StdSchedulerFactory(quartzConfig);
        scheduler = schedulerFactory.getScheduler();
        scheduler.start();
    } catch (SchedulerException e) {
        logger.error("Error starting scheduler", e);
    }
}


public boolean addJob(String name, int cronHour, int cronMinute) throws SchedulerException {
    JobDetail jobDetail = newJob(TcConnectionRefreshJob.class).withIdentity(name, group)
            .requestRecovery().build();
    String cronString = "0 " + cronMinute+" "+cronHour+" ? * *" ;
    CronTrigger cronTrigger = newTrigger().withIdentity(name, group).withSchedule(cronSchedule(cronString).
            withMisfireHandlingInstructionDoNothing()).build();
    scheduler.scheduleJob(jobDetail, cronTrigger);
    return true;
}

public boolean deleteJob(String name) {
    JobKey jobKey = JobKey.jobKey(name,group);
    TriggerKey triggerKey = TriggerKey.triggerKey(name,group);
    try {
        scheduler.unscheduleJob(triggerKey);
        scheduler.deleteJob(jobKey);
    } catch (SchedulerException e) {
        logger.error("Exception occurred "+e);
        return false;
    }
    return true;
}

ScheduledJob 类

public class ScheduledJob implements Job {

public static IMyService myService;

@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
    myService.executeAction();

}

@SuppressWarnings("static-access")
@Inject
public void setMyService(IMyService myService) {
    this.myService = myService;
}     

MyService 实现 IMyService 并将 IMyService 绑定到我的应用程序类中的 MyService 实现,例如 bind(IMyservice.class).toInstance(new MyService());

【问题讨论】:

标签: java cron quartz-scheduler dropwizard


【解决方案1】:

现在 标签的Featured 选项卡中有一个question,它与 Quartz 作业中的 DI 完全一致。

到目前为止,唯一有用的答案如下(为方便起见,我介绍了链接):

由于 Quartz 管理自己的线程,类不由 CDI 处理,因此您不能在 Quartz 类中注入 bean。 deltaspike module 的目的是允许在 Quartz Jobs 中注入 CDI bean。在内部,deltaspike 控制 CDI 上下文。

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 2012-12-31
    • 1970-01-01
    • 2011-08-23
    • 2017-06-16
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多