我们正在编写一些调度程序作业。作为一个简单的模式,我编写了一个调度程序类来管理所有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类中缺少服务上下文,并且各个服务引用都失败了。
这是错误的模式吗?调度程序的示例总是在同一类中为作业和调度程序提供支持。有没有办法可以分成调度程序和作业类,并从作业线程调用服务引用?
答案 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()));
这对我有用,但不确定这是不是很好的做法。