2016-10-06 43 views
0

私の問題解決のためにthisの質問がありましたが、私の場合に役立つものは何もありません。Spring + Quartz:@PostConstructメソッドが2回呼び出されました

私は、アプリケーションの起動時に実行される予定の複数のQuartzスケジュールの電子メールタスクを実行しているだけでなく、実行時に動的にスケジューリングされ、再スケジュールされ、スケジュールされません。以下は私のconfigクラスです。

@Configuration 
@ComponentScan(basePackages="de.it2media.dps.statistics") 
public class AppConfig{ 

    @Autowired private AutowireCapableBeanFactory autowireCapableBeanFactory; 

    @Bean 
    public SchedulerFactoryBean schedulerFactoryBean(){ 
     SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); 
     schedulerFactoryBean.setJobFactory(autowiringSpringBeanFactory()); 

     return schedulerFactoryBean; 
    } 

    @Bean 
    public SpringBeanJobFactory autowiringSpringBeanFactory(){  
     return new SpringBeanJobFactory(){ 
      @Override 
      protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { 
       Object job = super.createJobInstance(bundle); 
       autowireCapableBeanFactory.autowireBean(job); 

       return job; 
      } 
     }; 
    } 

    @Bean 
    public Scheduler scheduler() throws SchedulerException{ 
     Scheduler scheduler = schedulerFactoryBean().getScheduler(); 

     return scheduler; 
    } 
} 

私は以下のように私の@Controllerクラスのいずれかに@PostConstructの方法があります。

@Controller 
@RequestMapping("/task") 
public class TaskController extends BaseRemoteService implements TaskService { 

@Autowired Scheduler scheduler; 

@PostConstruct 
private void afterPropertiesSet() throws Exception { 
    List<EmailTask> taskList; 

    taskList = getSavedTasks(); 

    for (EmailTask emailTask : taskList) { 
     if (!scheduler.checkExists(new JobKey(emailTask.getTaskKey()))) { 
     JobDetail jobDetail = JobBuilder.newJob(EmailCronJob.class) 
       .withIdentity(emailTask.getTaskKey(), "emailTaskGroup").storeDurably(false).build(); 

     jobDetail.getJobDataMap().put("emailTask", emailTask); 

     CronTrigger cronTrigger = TriggerBuilder.newTrigger().forJob(jobDetail) 
       .withIdentity(emailTask.getTaskKey(), "emailTaskGroup") 
       .withSchedule(CronScheduleBuilder.cronSchedule(emailTask.getCronExpression())).build(); 

     scheduler.scheduleJob(jobDetail, cronTrigger); 
    } 
    } 

} 
} 

そして、私のweb.xmlファイル。

<context-param> 
    <param-name>contextClass</param-name> 
    <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> 
</context-param> 
<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>de.it2media.dps.statistics.server.config.AppConfig</param-value> 
</context-param> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextClass</param-name> 
     <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> 
    </init-param> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>de.it2media.dps.statistics.server.config.MVCConfig</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>/DPSStatistics/rpc/*</url-pattern> 
</servlet-mapping> 

私は春からMVCの設定をインポートしますが、これまでのところ、私はそれで豆をdelareする必要がありませんでしたが、別の設定ファイルを持っています。私はそれが本当に重要かどうかわからないが、ここに行く。

@Configuration 
@ComponentScan(basePackages="de.it2media.dps.statistics.server.controller") 
@EnableWebMvc 
public class MVCConfig {} 

だから、タイトルに述べたような問題は、@PostConstructメソッドが2回呼び出されていることです。そして、同じQuartzジョブがすべて2回作成しようとしていて、次の例外が発生します。

[INFO] 2016/10/06 13:42:27.505 WARN [main] AnnotationConfigWebApplicationContext:549 - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'taskController': Invocation of init method failed; nested exception is org.quartz.ObjectAlreadyExistsException: Unable to store Job : 'emailTaskGroup.423946369', because one already exists with this identification. 
    [INFO] 2016/10/06 13:42:27.510 ERROR [main] DispatcherServlet:502 - Context initialization failed 
    [INFO] org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'taskController': Invocation of init method failed; nested exception is org.quartz.ObjectAlreadyExistsException: Unable to store Job : 'emailTaskGroup.423946369', because one already exists with this identification. 
    [INFO] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:136) ~[spring-beans-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
    [INFO] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:408) ~[spring-beans-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
    [INFO] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1575) ~[spring-beans-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
    [INFO] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) ~[spring-beans-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
    [INFO] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
    [INFO] at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
    [INFO] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
    [INFO] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
    [INFO] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
    [INFO] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:751) ~[spring-beans-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
    [INFO] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861) ~[spring-context-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
    [INFO] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541) ~[spring-context-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
    [INFO] at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:668) ~[spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
    [INFO] at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:634) ~[spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
    [INFO] at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:682) ~[spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE] 

私は、問題は、私はクォーツのための私のスケジューラクラスにアプリケーション・コンテキストを提供する必要がAutowireCapableBeanFactoryとは何かを持って数えるが、私はよく分かりません。

私は完全に困惑しています。

+0

'@ComponentScan(basePackages = "de.it2media.dps.statistics")は'も '' @ComponentScan(basePackagesは= "de.it2media.dps.statistics.server.controller")を覆っています。 –

+0

はい、どうしたらいいですか? –

+2

あなたのルートコンテキストは '@Controller'sのすべてをスキャンする必要があります。その上に除外フィルタを置きます。 –

答えて

0

@M。デイナムは正しかった。私がしたのは、コントローラパッケージをAppConfig.javaの@ComponentScanから除外して動作させることだけでした。

@ComponentScan(basePackages="de.it2media.dps.statistics", 
    excludeFilters = { @Filter(Configuration.class), @Filter(Controller.class) }) 
関連する問題