【发布时间】:2020-09-10 18:38:03
【问题描述】:
我有一个基于属性动态调度作业的应用程序。它侦听 ServiceReadyEvent,然后安排作业。下面是一个通过工厂添加到上下文的小示例。
class JobsLoader(
@param:Named(TaskExecutors.SCHEDULED) val taskScheduler: TaskScheduler,
val myJobName: String
) : ApplicationEventListener<ServiceReadyEvent> {
override fun onApplicationEvent(event: ServiceReadyEvent?) {
taskScheduler.schedule("* * * * *", () -> println("running job $jobName"))
}
}
为了测试这段代码,我使用 kotest 进行了 Micronaut 测试。
@MicronautTest
class Job1Spec(
@param:Named(TaskExecutors.SCHEDULED) val taskScheduler: TaskScheduler
) {
init {
"start job loader" {
val jobsLoader = JobsLoader("job1", taskScheduler)
jobsLoader.onApplicationEvent(ServiceReadyEvent(ServiceInstance.of("test", URL("http://localhost:8080"))))
}
"verify the job runs" {
//code here to verify the job ran and performed the correct calls
}
}
}
我还有另一份工作的第二次测试
@MicronautTest
class Job2Spec(
@param:Named(TaskExecutors.SCHEDULED) val taskScheduler: TaskScheduler
) {
init {
"start job loader" {
val jobsLoader = JobsLoader("job2", taskScheduler)
jobsLoader.onApplicationEvent(ServiceReadyEvent(ServiceInstance.of("test", URL("http://localhost:8080"))))
}
"verify the job runs" {
//code here to verify the job ran and performed the correct calls
}
}
}
我的问题在于,在第二次测试期间,我看到第一个作业仍然在第二次测试运行期间安排:
[INFO] 2020-09-10 12:57:00,005 pool-2-thread-1 running job job1
[INFO] 2020-09-10 12:57:00,009 pool-4-thread-1 running job job2
除了作业的运行之外,关于第一次运行测试的其他一切都已停止。我发现它仍在运行,因为它在作业运行期间由于 HttpClient 被关闭而引发异常。
我试过了
- 使用
rebuildContext = true在测试之间重建测试上下文 - 在我的
JobsLoader类中跟踪预定的期货,然后在afterSpec函数中取消它们。当我去取消它们时,期货列表总是空的。 - 手动刷新 TaskScheduler 和 ExecutorService bean
所有测试都顺利通过,但也有一些例外——尤其是当我要测试越来越多的工作时,除了我正在测试的工作之外的所有工作都不断失败。我不确定这是否是 kotest、micronaut 测试、调度程序、某种组合或完全其他的问题(我也看到了 vertx 日志,但我认为这不是问题)。我真的只需要想办法在下一次测试运行之前杀死这些作业/线程。
任何帮助或想法将不胜感激!
【问题讨论】:
标签: java kotlin micronaut kotest