调度程序作业失败的ResourceResolverFactory服务引用

时间:2016-02-04 18:14:20

标签: cq5 aem

我们正在编写一些调度程序作业。作为一个简单的模式,我编写了一个调度程序类来管理所有cron调度,而工作程序作业则编写在不同的类中。

工作类看起来很简单:

@Component
@Service
public class DeamonJob implements Runnable {
    @Reference 
    private ResourceResolverFactory resolverFactory;
}

public void run() {
  // business logic.
}

现在这个解析器工厂总是为空。由于此作业是从调度程序实例化为

DeamonJob j = new DeamonJob();
scheduler.schedule(j, schedulerOptions);

由于我们没有从sling调用服务(比如sling.getService()),我相信Job类中缺少服务上下文,并且各个服务引用都失败了。

这是错误的模式吗?调度程序的示例总是在同一类中为作业和调度程序提供支持。有没有办法可以分成调度程序和作业类,并从作业线程调用服务引用?

2 个答案:

答案 0 :(得分:4)

为了能够使用@Reference,你必须使用" singleton"吊索服务而不是手动实例化它。您可以直接定义quartz调度程序:

@Component
@Service
@Properties({ @Property(label = "Cron Expression", name = "scheduler.expression", value = "0 0 0 * * ?") })
public class DeamonJob implements Runnable

或者您将Runnable创建为没有Annotations的简单类,并在构造函数中提供ResourceResolver:

public class DeamonJob implements Runnable {

    private final ResourceResolver resolver;

    public DeamonJob(ResourceResolver resolver) {
        this.resolver = resolver;
    }

    public void run() {
        // business logic.
    }

}

答案 1 :(得分:0)

我有一个替代方法来调用POJO类的服务。

BundleContext bundleContext = FrameworkUtil.getBundle(ResourceResolverFactory.class).getBundleContext();
ResourceResolverFactory factory = (ResourceResolverFactory) bundleContext.getService(bundleContext.getServiceReference(ResourceResolverFactory.class.getName()));

这对我有用,但不确定这是不是很好的做法。

相关问题