Spring 计划任务在tomcat生产中运行两次

Spring 计划任务在tomcat生产中运行两次,spring,spring-boot,tomcat,Spring,Spring Boot,Tomcat,我有一个预定类的onde应用程序spring boot v2,在开发者环境中,我的方法运行在类中预定运行一次。 但我是为生产而构建的(使用mvn clean package)并在Tomcat8中发布 我的任务执行了两次 这是我预定的课程 @Service @EnableScheduling public class SchedulerEmailService { @Autowired private SenderEmailService senderEmailService;

我有一个预定类的onde应用程序spring boot v2,在开发者环境中,我的方法
运行
在类中预定运行一次。 但我是为生产而构建的(使用
mvn clean package
)并在Tomcat8中发布 我的任务执行了两次

这是我预定的课程

@Service
@EnableScheduling
public class SchedulerEmailService {

    @Autowired
    private SenderEmailService senderEmailService;

    private static final Logger LOG = LoggerFactory.getLogger(SchedulerEmailService.class);

    @Autowired
    private TaskService taskService;

    @Scheduled(fixedDelay = 10000)
    public void run() {

        LOG.info("Status do Servico: " + taskService.isEnabled());
        if(taskService.isEnabled()) {       
            LOG.info("Executando... {}", LocalDateTime.now());
            senderEmailService.enviarEmail();
        }else {
            LOG.info("Falsa execução do servico... {}", LocalDateTime.now());
        }

    }


}
在生产中,这是日志

O servico foi parado
 Status do Servico: false
Falsa execução do servico... 2018-08-21T15:26:59.663
Status do Servico: true
Executando... 2018-08-21T15:27:01.183
Status do Servico: false
Falsa execução do servico... 2018-08-21T15:27:09.664
Status do Servico: true
Executando... 2018-08-21T15:27:11.368
在日志中看到她跑了一次是假的,另一次是真的。 Obs:我定义变量
taskService.isRunning
for
false
但在执行值default
true

编辑 我在日志中打印哈希代码类,结果如下:

2018-08-22 07:49:45.996  INFO 8168 --- [pool-19-thread-1] c.c.s.services.SchedulerEmailService     : Status do Servico: true
2018-08-22 07:49:45.996  INFO 8168 --- [pool-19-thread-1] c.c.s.services.SchedulerEmailService     : HashCode Classe: 19875385
2018-08-22 07:49:45.996  INFO 8168 --- [pool-19-thread-1] c.c.s.services.SchedulerEmailService     : Executando... 2018-08-22T07:49:45.996
2018-08-22 07:49:50.730  INFO 8168 --- [pool-20-thread-1] c.c.s.services.SchedulerEmailService     : Status do Servico: true
2018-08-22 07:49:50.730  INFO 8168 --- [pool-20-thread-1] c.c.s.services.SchedulerEmailService     : HashCode Classe: 11898713
2018-08-22 07:49:50.731  INFO 8168 --- [pool-20-thread-1] c.c.s.services.SchedulerEmailService     : Executando... 2018-08-22T07:49:50.731
2018-08-22 07:49:56.121  INFO 8168 --- [pool-19-thread-1] c.c.s.services.SchedulerEmailService     : Status do Servico: true
2018-08-22 07:49:56.121  INFO 8168 --- [pool-19-thread-1] c.c.s.services.SchedulerEmailService     : HashCode Classe: 19875385
2018-08-22 07:49:56.121  INFO 8168 --- [pool-19-thread-1] c.c.s.services.SchedulerEmailService     : Executando... 2018-08-22T07:49:56.121
执行中存在两个不同的类。
如何解决这个问题?

从日志中的hashCode可以看到,
SchedulerEmailService
被Spring实例化了两次。 我不能100%确定原因,但是
@EnableScheduling
注释不是用于bean类,而是用于
@Configuration

启用Spring的计划任务执行功能,类似于Spring的XML命名空间中的功能。在@Configuration类上使用,如下所示:

我建议从
SchedulerEmailService
中删除
@EnableScheduling
注释,并添加一个带有
ComponentScan
的配置,包括
SchedulerEmailService

@Service
public class SchedulerEmailService {

    // ...

    @Scheduled(fixedDelay = 10000)
    public void run() {
        // ...
    }
}

@Configuration
@EnableScheduling
@ComponentScan(basePackages="your.package")
public class AppConfig {
}

您是否可以扩展
LOG.info
以同时输出实例的
this
hashCode
?我想看看这个类是否有多个实例。当然,我确定,我会在这里发布结果
Status do Servico:false 21694996 Status do Servico:true 521900
false或true后面的数字是类的hashcode怎么说?类实例被复制了?谢谢你们的回复,我做了类似于建议的更改,但我可以看到类执行了两次