Spring 计划任务在tomcat生产中运行两次
我有一个预定类的onde应用程序spring boot v2,在开发者环境中,我的方法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;
运行
在类中预定运行一次。
但我是为生产而构建的(使用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
forfalse
但在执行值defaulttrue
编辑
我在日志中打印哈希代码类,结果如下:
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怎么说?类实例被复制了?谢谢你们的回复,我做了类似于建议的更改,但我可以看到类执行了两次