2016-05-08 2 views
2

私は、依存関係注入のためにCDIを使用してWildfly 10.0.0で実行するJavaee7 Webアプリケーションを開発しており、Quartzでいくつかのジョブをスケジュールしたいと考えています。 これは、ジョブをスケジュールクラスです:CDIでQuartzを使用するためのカスタムCDIJobFactory

@Named 
public class CdiJobFactory implements JobFactory { 

    @Inject 
    private BeanManager beanManager; 

    @Override 
    public Job newJob(TriggerFiredBundle bundle, Scheduler Scheduler) throws SchedulerException { 
    JobDetail jobDetail = bundle.getJobDetail(); 
    Class<? extends Job> jobClazz = jobDetail.getJobClass(); 
    Bean<?> bean = beanManager.getBeans(jobClazz).iterator().next(); 
    CreationalContext<?> ctx = beanManager.createCreationalContext(bean); 
    return (Job) beanManager.getReference(bean, jobClazz, ctx); 
    } 
} 

そして、これが仕事です::

@Singleton 
@Startup 
public class ScheduledJobsManager { 

    private Scheduler scheduler; 

    @Inject 
    private CdiJobFactory jobFactory; 

    @PostConstruct 
    public void postConstruct() { 
     JobDetail jobDetail = null; 
     CronTrigger trigger = null; 
     scheduler = new StdSchedulerFactory().getScheduler(); 
     scheduler.setJobFactory(jobFactory); 
     boolean scheduled = false; 

     jobDetail = JobBuilder.newJob(ImagesProcessJob.class) 
     .withIdentity("imageProcessJob", "mediaProxyJobs") 
     .build(); 
     trigger = TriggerBuilder.newTrigger().withIdentity("imageProcessTrigger", "mediaProxyTriggers") 
       .withSchedule(CronScheduleBuilder.cronSchedule(imageProcessScheduleStr)).build(); 
     scheduler.scheduleJob(jobDetail, trigger); 
     scheduler.start(); 
    } 

    @PreDestroy 
    public void preDestroy() { 
     if (scheduler != null && scheduler.isStarted()) { 
      scheduler.shutdown(false); 
     } 
    } 
} 

これはクォーツにCDIを使用できるようにするカスタムJobFactoryある

@Named 
public class ImagesProcessJob implements Job { 
    @Inject 
    private MyManager myManager; 

    public ImagesProcessJob() {} 

    @Override 
    public void execute(JobExecutionContext context) throws JobExecutionException { 
     try { 
      myManager.doTheJob(); 
     } catch(Exception e) { 
      throw new JobExecutionException(e); 
     } 
    } 
} 

warファイルを展開しようとすると、このエラーが発生します。

16:03:19,524 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-3) MSC000001: Failed to start service jboss.deployment.unit."imageproxy.war".WeldStartService: org.jboss.msc.service.StartException in service jboss.deployment.unit."imageproxy.war".WeldStartService: Failed to start service 
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1904) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type CdiJobFactory with qualifiers @Default 
    at injection point [BackedAnnotatedField] @Inject private cat.xavisan.imaging.imageproxy.schedule.ScheduledJobsManager.jobFactory 
    at cat.xavisan.imaging.imageproxy.schedule.ScheduledJobsManager.jobFactory(ScheduledJobsManager.java:0) 

    at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:359) 
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:281) 
    at org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:134) 
    at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:155) 
    at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:518) 
    at org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:68) 
    at org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:66) 
    at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:63) 
    at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:56) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
    at org.jboss.threads.JBossThread.run(JBossThread.java:320) 

これは間違っている何が起こっているのかの任意のアイデアbeans.xmlの

<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" 
     version="1.2" bean-discovery-mode="annotated"> 

</beans> 

の内容でしょうか?

+0

'beans.xml'はどのように見えますか? DeltaSpikeは既にクォーツの統合を提供しています。http://deltaspike.apache.org/documentation/scheduler.html –

+0

beans.xmlの内容を追加する質問を編集しました – Xavisan

答えて

3

bean-discovery-mode="annotated"を使用していますが、クラスにアノテーションを定義するBeanを提供していないという問題があります。

理想的には、@Namedは、UIタイプのやり取りにのみ使用され、その他のベンダー固有の機能はほとんどありません。その修飾子。この作業を行うには、@Namedの代わりに@ApplicationScopedを使用してアノテーションを付けます。

CDI仕様内の参照:http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#bean_defining_annotations

+0

両方のクラスを@ApplicationScopedとしてアノテートしますか?私はCdiJobFactoryについてはっきりしているが、ImagesProcessJobについては明らかではない。もしそうなら、私はいつもImageProcessJobクラスの同じインスタンスを持っていますか? – Xavisan

+0

あなたの統合が書かれている通り、そうです。スコープを小さくすると、依存スコープのBeanがリークします。 –

関連する問題