Java 有没有办法在测试之间停止micronaut计划的作业?
我有一个基于属性动态调度作业的应用程序。它侦听ServiceReadyEvent,然后安排作业。下面是一个通过工厂添加到上下文中的小示例Java 有没有办法在测试之间停止micronaut计划的作业?,java,kotlin,micronaut,kotest,Java,Kotlin,Micronaut,Kotest,我有一个基于属性动态调度作业的应用程序。它侦听ServiceReadyEvent,然后安排作业。下面是一个通过工厂添加到上下文中的小示例 class JobsLoader( @param:Named(TaskExecutors.SCHEDULED) val taskScheduler: TaskScheduler, val myJobName: String ) : ApplicationEventListener<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"))
}
}
我还有另一份工作的第二次考试
@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在测试之间重建测试上下文
- 在my
类中跟踪计划的期货,然后在JobsLoader
函数中取消它们。当我去取消期货时,期货清单总是空的afterSpec
- 手动刷新TaskScheduler和ExecutorService bean
任何帮助或想法都将不胜感激 所以在输入了所有这些之后,我几乎立刻就明白了我的问题所在。我正在测试中手动创建一个作业,它不是micronaut上下文的一部分,所以当我去尝试取消作业时,我的未来列表总是空的 我更改了测试以加载作业并将其添加到上下文:
var jobsLoader: JobsLoader? = null
override fun beforeSpec(spec: Spec) {
jobsLoader = JobsLoader(taskScheduler, getJobsConfiguration(), jobResolver, eventPublisher)
jobsLoader?.onApplicationEvent(ServiceReadyEvent(ServiceInstance.of("test", URL("http://localhost:8080"))))
super.beforeSpec(spec)
}
override fun afterSpec(spec: Spec) {
jobsLoader?.stopJobs()
super.afterSpec(spec)
}
然后在我的作业加载器中提供了一个函数来取消任何作业
class JobsLoader(
@param:Named(TaskExecutors.SCHEDULED) val taskScheduler: TaskScheduler,
val myJobName: String
) : ApplicationEventListener<ServiceReadyEvent> {
private val scheduledJobs = mutableListOf<ScheduledFuture<*>>()
override fun onApplicationEvent(event: ServiceReadyEvent?) {
val scheduledFuture = taskScheduler.schedule("* * * * *", () -> println("running job $jobName"))
scheduledJobs.add(scheduledFuture)
}
fun stopJobs() {
scheduledJobs.forEach { it.cancel(false) }
}
}
类作业加载程序(
@param:Named(TaskExecutors.SCHEDULED)val taskScheduler:taskScheduler,
val myJobName:字符串
):ApplicationEventListener{
private val scheduledJobs=mutableListOf()
覆盖ApplicationEvent上的乐趣(事件:ServiceReadyEvent?){
val scheduledFuture=taskScheduler.schedule(“****”,()->println(“正在运行的作业$jobName”))
scheduledJobs.add(scheduledFuture)
}
有趣的临时工{
scheduledJobs.forEach{it.cancel(false)}
}
}
class JobsLoader(
@param:Named(TaskExecutors.SCHEDULED) val taskScheduler: TaskScheduler,
val myJobName: String
) : ApplicationEventListener<ServiceReadyEvent> {
private val scheduledJobs = mutableListOf<ScheduledFuture<*>>()
override fun onApplicationEvent(event: ServiceReadyEvent?) {
val scheduledFuture = taskScheduler.schedule("* * * * *", () -> println("running job $jobName"))
scheduledJobs.add(scheduledFuture)
}
fun stopJobs() {
scheduledJobs.forEach { it.cancel(false) }
}
}