2017-05-23 11 views
0

dropwizardアプリケーションでQuartzジョブスケジューラを使用してジョブをスケジューリングしようとしています。クォーツジョブインターフェースを実装するクラスでは、私のサービスクラスを少数注入してメソッドを使用します。しかし、それは注入されていない、そのオブジェクトのnullを取得しています。誰かが私を助けてくれますか?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を実装し、バインドのように自分のアプリケーションクラスでMyServiceで実装にIMyServiceを結合しています(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ジョブにCDI Beanを挿入できるようにすることです。内部的には、deltaspikeはCDIコンテキストを制御します。

関連する問題