2017-05-23 62 views
0

我正試圖在dropwizard應用程序中使用Quartz作業調度程序來安排作業。在實現Quartz Job接口的類中,我注入了幾個服務類來使用它的方法。但它沒有被注入,對那個對象變爲空。有人可以幫助我嗎?依賴注入在Quartz工作預定的類上不工作

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落實在我的應用類(IMyservice.class).toInstance(新的MyService() );

+0

查看此鏈接:https://devsoap.com/injecting-cdi-managed-beans-into-quarz-jobs/。另外,在你的代碼中,爲什麼你在'myService'字段使用'public static'? – Rouliboy

回答

1

標籤的Featured標籤中有question標籤,它正好說明了Quartz作業中的DI。

唯一有用的答案至今聲明如下(鏈接由我爲您提供方便引入):

石英管理自己的線程,類沒有被CDI處理的,所以你不能在石英注入豆類。 deltaspike module的目標是允許在Quartz Jobs中注入CDI bean。在內部,deltaspike控制CDI上下文。