Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring调度任务的多次调用_Java_Multithreading_Spring_Annotations_Scheduled Tasks - Fatal编程技术网

Java Spring调度任务的多次调用

Java Spring调度任务的多次调用,java,multithreading,spring,annotations,scheduled-tasks,Java,Multithreading,Spring,Annotations,Scheduled Tasks,因此,我对使用Spring的@scheduled注释声明的一些预定任务有点问题。首先,这里是我的应用程序配置: <beans <!--Namespaces-->> <!-- Search for annotated beans --> <context:component-scan base-package="com.my.package.task"/> <task:annotation-driven execut

因此,我对使用Spring的
@scheduled
注释声明的一些预定任务有点问题。首先,这里是我的应用程序配置:

<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>
以下是我宣布的计划任务:

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
     }
}
现在我遇到的问题是,当这些任务运行时,我会收到多封电子邮件(请参阅任务2)。我在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小时,我会收到更多的电子邮件(我想我还没有机会知道这是否是由于多线程/方法调用造成的)


有人知道是什么导致了第二个任务的多次调用吗?我查看了,在“Note”下面提到,如果在运行时初始化
@Scheduled
类的多个实例,则可以获得多个调用。我的AppConfig和app config.xml会发生这种情况吗?

你的双重初始化理论是有道理的,但和你一样,我看不出Task1和Task2之间有什么区别。是否添加构造函数并设置断点?Task2是否被其他代码引用?是否尝试将任务类声明为单例?是否找到了解决方案?我也面临同样的问题。
Task1 -- Thread ID: 10 Thread Name: myScheduler-1
Task2 -- Thread ID: 23 Thread Name: myScheduler-2
Task2 -- Thread ID: 11 Thread Name: myScheduler-2