Osgi 卡拉夫石英

Osgi 卡拉夫石英,osgi,quartz-scheduler,karaf,Osgi,Quartz Scheduler,Karaf,如何在quartz触发器中访问我的OSGi服务 下面,触发计时器时,我的服务公司DAO为空。我需要将包上下文提供给调度程序还是作业?如果是,怎么做 @Service @Component(immediate = true, specVersion = "1.1", inherit = true) public class TechnicalStageTimer implements Job { @Reference(cardinality = MANDATORY_UNARY, poli

如何在quartz触发器中访问我的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();
    }

}
@服务
@组件(immediate=true,specVersion=“1.1”,inherit=true)
公共类TechnicalStageTimer实现作业{
@引用(基数=必需的一元,策略=动态)
受保护公司道公司道;
私有静态最终记录器LOG=LoggerFactory.getLogger(TechnicalStageTimer.class.getCanonicalName());
调度程序;
@激活
public void start(BundleContext)引发异常{
LOG.warn(“启动计时器技术标记”);
SchedulerFactory sf=新StdSchedulerFactory();
scheduler=sf.getScheduler();
JobDetail job=JobBuilder.newJob(TechnicalStageTimer.class).build();
触发器触发器=TriggerBuilder.newTrigger()
.with schedule(CronScheduleBuilder.dailyAtHourAndMinute(11,00))//每天11:00
.build();
scheduleJob(作业,触发器);
scheduler.start();
}
@停用
公共void stop(BundleContext上下文)引发异常{
调度器关闭(true);
}
public void execute(作业执行上下文)
抛出JobExecutionException异常{
日志警告(“计时器触发”);
List companys=companyDao.getPool();
}
}

您必须记住一件事——Quartz为每次执行实例化新作业实例。如果你想访问外部组件(从新工作的角度来看),你必须以某种方式将其带来。 在这种情况下,您有两种选择:

  • 作业执行上下文
  • 静态场参考

第一个更可靠,第二个更黑客。

我将companyDao添加到作业数据映射中,并从作业执行服务访问它。