Micronaut@计划作业未运行



我正在使用groovy和gradle开发一个现有的micronaut应用程序,该应用程序有一个调度器,预计每1分钟运行一次。不知怎的,调度程序根本不运行,应用程序也不会抛出任何错误(只是保持静默(。我看不出有什么理由不这样做,但我是micronaut的新手,我可能会错过一些东西。任何指针都是值得赞赏的,从很长一段时间以来一直困扰着这个问题。这是调度程序类

@CompileStatic
@Singleton
@Requires(notEnv = "test")
class CsmTestJob {
private final CsmTestJobExecutor csmTestJobExecutor
CsmTestJob(CsmTestJobExecutor csmTestJobExecutor) {
this.csmTestJobExecutor = csmTestJobExecutor
}
@Scheduled(fixedDelay = '${feature.job.execute}')
void executeCsmTests() {
csmTestJobExecutor.executeCsmTests()
}
}

这是application.yml文件

micronaut:
application:
name: csm
server:
port: 8080
host: 127.0.0.1
feature: 
job:
execute: "1m"

我在AWS Docker(EC2 Amazon(中运行Micronaut时遇到了这个问题(我认为也可以在1核CPU上复制(

研究结果:

  1. 要在Docker中使用@Scheduler再现运行的应用程序,请选择--cpus 1

    docker运行--cpus 1 microscheduleapp

  2. 看起来Micronaut在启动时依赖于ForkJoinPool,但如果您有1个以上的CPU内核,默认的ForkJoinPool将工作。在这种情况下,Micronaut无法实例化Scheduled服务。但手动启动的计划任务运行良好。

  3. 要修复此问题,请使用ForkJoinPool并行选项允许池超过CPU:

    java.Djava.util.concurrent.FukJoinPool.common.parallelism=4-jar application.jar

有关于删除静态编译和删除动态调度值的评论,但我认为这两者都不太可能相关。问题中没有足够的代码可以确定,但我怀疑您的代码可能使用了错误的@Singleton注释。

请访问项目https://github.com/jeffbrown/nilambersinghscheduledjob.

https://github.com/jeffbrown/nilambersinghscheduledjob/blob/c7892b556c8564d34d1b3265f53c0f81904150aa/src/main/resources/application.yml

micronaut:
application:
name: nilambersinghscheduledjob
feature:
job:
execute: "1m"

https://github.com/jeffbrown/nilambersinghscheduledjob/blob/c7892b556c8564d34d1b3265f53c0f81904150aa/src/main/groovy/com/example/CsmTestJob.groovy

package com.example
import groovy.transform.CompileStatic
import io.micronaut.context.annotation.Requires
import io.micronaut.scheduling.annotation.Scheduled
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import javax.inject.Singleton
@CompileStatic
@Singleton
@Requires(notEnv = "test")
class CsmTestJob {
private static final Logger log = LoggerFactory.getLogger(CsmTestJob)
@Scheduled(fixedDelay = '${feature.job.execute}')
void executeCsmTests() {
log.debug "CSM Test Job Is Running"
}
}

这一切都很好。

我不久前遇到了类似的问题,结果发现我在类上的其他注释之一以某种方式干扰并阻止了调度程序的运行。

我会尝试删除CompileStatic,并将时间表硬编码为直接字符串文字。

还要确保您正在导入javax.inject.Singleton,否则对Singleton的引用将选择groovy默认groovy.lang.Singleton,这将破坏micronaut机制。

最后一件事是打开调试日志并读取micronaut打印的大量信息。在我的案例中,我可以从调试日志中看到bean初始化存在问题。

我意识到这不是一个直接的解决方案,但我认为给出几个潜在的指针总比什么都没有要好。

我们在AWS上的Kubernetes中运行Micronaut 3.8.4时也遇到了同样的情况。该问题与一个java17错误有关。基本上,正如@Dmitry所说,ForkJoinPool不能使用1个内核。这个错误在jdk 19中得到了解决。

升级DockerFile以使用openjdk:19alpine在不更改属性-Djava.util.concurrent.FukJoinPool.common.parallelism的情况下解决了问题

最新更新