Spring调度任务的多次调用

时间:2010-10-27 21:30:54

标签: java multithreading spring annotations scheduled-tasks

所以我在使用Spring @Scheduled注释声明的一些计划任务时遇到了一些问题。首先,这是我的app-config:

<beans <!--Namespaces-->>
    <!-- Search for annotated beans -->
    <context:component-scan  base-package="com.my.package.task"/>

    <task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>

    <task:executor id="myExecutor" pool-size="5"/>

    <task:scheduler id="myScheduler" pool-size="10"/>

    <tx:annotation-driven/>
</beans>

我还有一个AppConfig类:

@Configuration
@ImportResource("classpath:/config/app-config.xml")
public class AppConfig {
     //Bean declarations but NO references to the Scheduled tasks or their classes
}

以下是我宣布的预定任务:

public abstract class ScheduledTask {
     private ApplicationContext appContext;

     abstract void doSomething();

     protected getAppContext() {
          if(appContext == null) {
               appContext = new AnnotationConfigApplicationContext(AppConfig.class);
          }

          return appContext;
     }
     //Other common methods
}

@Service
public class Task1 extends ScheduledTask {    
     @Scheduled(cron="0 0 9 * * MON-FRI")
     public void doSomething() {
        System.out.println("Task1 -- Thread ID: " + Thread.currentThread().getId() + " Thread Name: " + Thread.currentThread().getName());
         //Update the database with new values
     }
}

@Service
public class Task2 extends Scheduledtask {
     @Scheduled(cron="0 0 10 * * MON-FRI")
     public void doSomething() {
          System.out.println("Task2 -- Thread ID: " + Thread.currentThread().getId() + " Thread Name: " + Thread.currentThread().getName());
          //Get some data from database and send email with data from DB
     }
}

现在我遇到的问题是,当这些任务运行时,我会收到多封电子邮件(参见Task2)。我在print语句中添加了以查看方法是否被多次调用而Task2由两个不同的线程执行两次。我希望Spring只调用一次计划任务。这是我得到的输出:

Task1 -- Thread ID: 10 Thread Name: myScheduler-1
Task2 -- Thread ID: 23 Thread Name: myScheduler-2
Task2 -- Thread ID: 11 Thread Name: myScheduler-2 

如果我在晚上运行并将cron作业设置为相隔4小时,我就会开始发送更多电子邮件(我以为我没有机会看到这是否是由于多个线程/方法调用)。 / p>

有没有人有任何想法可能导致第二个任务的多次调用?我查看了Spring Documentation并在'Note'下提到如果在运行时初始化@Scheduled类的多个实例,则可以进行多次调用。可以用我的AppConfig和app-config.xml在这里发生吗?

0 个答案:

没有答案