2014-10-06 82 views
0

如何在石英觸發器中訪問我的OSGi服務?石英在卡拉夫

下面,當定時器被觸發時,我的服務公司Dao爲空。我是否需要將捆綁環境提供給調度程序或作業?如果是這樣,怎麼樣?

@Service 
@Component(immediate = true, specVersion = "1.1", inherit = true) 
public class TechnicalStageTimer implements Job { 

    @Reference(cardinality = MANDATORY_UNARY, policy = DYNAMIC) 
    protected CompanyDao companyDao; 

    private static final Logger LOG = LoggerFactory.getLogger(TechnicalStageTimer.class.getCanonicalName()); 

    Scheduler scheduler; 

    @Activate 
    public void start(BundleContext context) throws Exception { 

     LOG.warn("Starting Timer TechnicalStageTimer"); 
     SchedulerFactory sf = new StdSchedulerFactory(); 
     scheduler = sf.getScheduler(); 

     JobDetail job = JobBuilder.newJob(TechnicalStageTimer.class).build(); 
     Trigger trigger = TriggerBuilder.newTrigger() 
       .withSchedule(CronScheduleBuilder.dailyAtHourAndMinute(11, 00)) // every day at 11:00 
       .build(); 
     scheduler.scheduleJob(job, trigger); 
     scheduler.start(); 

    } 

    @Deactivate 
    public void stop(BundleContext context) throws Exception { 
     scheduler.shutdown(true); 
    } 

    public void execute(JobExecutionContext context) 
      throws JobExecutionException { 

     LOG.warn("Timer Triggered"); 
     List<Company> companies = companyDao.getPool(); 
    } 

} 
+0

我將公司Da添加到作業數據映射中,並從作業執行服務中訪問它。 – user2641043 2014-10-06 16:33:56

回答

0

你必須記住一件事 - Quartz爲每次執行實例化新的工作實例。如果你想訪問外部組件(從新的工作角度來看),你必須以某種方式帶來它。 在這種情況下,你有兩個選擇:

  • 作業執行上下文
  • 靜態字段參考

第一個是更可靠,二是相當破解。