簡體   English   中英

如何使用Dagger 2在Quartz作業中注入依賴項

[英]How to inject dependency in a Quartz job using Dagger 2

我使用Dagger 2作為我的DI框架,並為其提供了一個singleton類實例。

我還使用Quartz Scheduler來調度作業。 有什么方法可以將單例類注入Quartz作業嗎?

Dagger 2模塊:

@Module
public class MyModule {

    @Provides
    @Singleton
            Messager provideMessager() {

        return new CustomMessager();
    }
}

匕首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.");
    }

}

編輯

我創建了一個MyJobScheduler類,該類調用Quartz Job:

    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.");
    }
}

這是解決此問題的正確方法嗎? 任何輸入將不勝感激。

您的EDIT 2 DependencyResolver方法克服了使用Dagger注入依賴項的全部原因,因為您的工作從單例提供程序獲取了依賴項。 :-)它完全繞過了Dagger的好處,因此您可能還對源依賴項本身只有一個單例,例如: Messager messager = CustomMessager.getInstance()或類似的東西。

使用依賴注入的原因之一是協助進行單元測試,在這種情況下,您將失去在單元測試中模擬Messager實現的功能。

JobFactoryAPI文檔中提到了將依賴注入與Quartz作業一起使用的正確方法: “該接口可能對那些希望其應用程序通過某些特殊機制生成Job實例的人有用,例如為依賴注入提供操作性“。

訣竅是創建自己的擴展SimpleJobFactory的作業工廠,然后您有機會初始化/注入作業的依賴項,如下所示:

public class MyJobFactory extends SimpleJobFactory {
    private final MyComponent component;

    @Inject
    public MyJobFactory(MyComponent component) {
        this.component = component;
    }

    @Override
    public Job newJob(TriggerFiredBundle bundle, Scheduler scheduler) throws SchedulerException {
        final Job job = super.newJob(bundle, scheduler);
        if (job instanceof MyJob) {
            component.inject((MyJob) job);
        }
        return job;
    }
}

然后,您告訴調度程序使用作業工廠:

scheduler.setJobFactory(myJobFactory);

在GitHub上查看完整代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM