【发布时间】:2015-07-28 08:28:03
【问题描述】:
我使用 Dagger 2 作为我的 DI 框架,并提供了一个单例类实例。
我也使用 Quartz Scheduler 来安排作业。有没有办法将单例类注入到 Quartz 作业中?
匕首 2 模块:
@Module
public class MyModule {
@Provides
@Singleton
Messager provideMessager() {
return new CustomMessager();
}
}
Dagger 2 组件:
@Component(modules = MyModule.class)
@Singleton
public interface MyComponent {
Messager messager();
}
石英工作:
public class MyJob implements Job {
// @Inject
Messager messager;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
messager.sendMessage("Hello.");
}
}
编辑
我创建了一个调用 Quartz Job 的 MyJobScheduler 类:
public class MyJobScheduler {
public void scheduleJob() {
JobDetail myJob = JobBuilder.newJob(MyJob.class)
.withIdentity("myJobId", "Group1")
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("myTriggerId", "Group1")
.startNow()
.build();
Scheduler scheduler = new org.quartz.impl.StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(myJob, trigger);
}
}
编辑 2
所以我设法配置它来工作,但我不知道这是否是正确的方法。
首先我创建了一个DependencyResolver 类,我将其用作单例:
public class DependencyResolver {
private static DependencyResolver _instance = null;
private static MyComponent _myComponent;
public static MyComponent getMyComponent() {
return _myComponent;
}
protected DependencyResolver() {
// Exists only to defeat instantiation.
}
public static void initialize() {
_myComponent = DaggerMyComponent.builder().build();
}
}
然后我在main方法中调用了initialize方法:
DependencyResolver.initialize();
MyComponent myComponent = DependencyResolver.getMyComponent();
我在 MyJob 类中使用了 DependencyResolver 来获取 Messager 单例实例。
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
MyComponent myComponent = DependencyResolver.getMyComponent();
Messager messager = myComponent.messager();
messager.sendMessage("Hello.");
}
}
这是解决此问题的正确方法吗?任何意见将不胜感激。
【问题讨论】:
-
Quartz 作业如何实例化? (
new MyJob()在哪里) -
@ThorbjørnRavnAndersen 查看编辑。这是一个非常基本的 Quartz 实现。
标签: java quartz-scheduler dagger-2