2014-10-06 2 views
0

석영 트리거로 내 OSGi 서비스에 액세스하려면 어떻게해야합니까?카라프의 석영

아래에서 타이머가 실행될 때 내 서비스 회사 Dao는 null입니다. 번들 컨텍스트를 스케줄러 나 작업에 제공해야합니까? 그렇다면 어떻게?

@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

작업 데이터 맵에 companyDao를 추가하고 작업 실행 서비스에서 액세스했습니다. – user2641043

답변

0

- Quartz는 매 실행마다 새 작업 인스턴스를 인스턴스화한다는 점을 기억해야합니다. 새로운 작업 관점에서 외부 구성 요소에 액세스하려는 경우 어떻게 든 가져와야합니다. 이러한 경우에 은 두 가지 옵션이 있습니다 :

  • 정적 필드 참조
  • 첫 번째 사람이 훨씬 더 신뢰할 수

    • 작업 실행 컨텍스트를, 두 번째는 오히려 해킹됩니다.