junit spring boot ScheduledExecutorService日程表未运行

时间:2017-08-25 08:41:26

标签: multithreading spring-boot junit

ScheduledExecutorService用于bean构造函数,该构造函数应在spring boot启动时运行。

@RestController
public class TestController {
    ScheduledExecutorService service = Executors.newScheduledThreadPool(1);

    public TestController() {
        service.schedule(() -> {
            // task
        }, 0, TimeUnit.SECONDS);

        service.shutdown();
    }

但是,有时候,任务永远不会被调用。在调试模式下,service.shutdown()将服务提供为:

active threads = 1, queued tasks = 0, completed tasks = 0

虽然这不会一直发生。当它按照我认为应该运行时,同一行的服务对象提供排队任务或完成任务1。 这只发生在junit测试期间,

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest()
@AutoConfigureMockMvc
public class ScheduledExecutorServiceTest {
    @Test
    public void test() {
    }
}

debug mode shows service has 0 queued or completed tasks

1 个答案:

答案 0 :(得分:0)

您可以通过调用

来延迟控制器线程以等待执行预定线程
scheduledFuture.get() or 
scheduledFuture.get(long timeout, TimeUnit unit), 

其中

scheduledFuture = service.schedule(..) 

之前

service.shutdown(). 

您正在安排任务在另一个线程中运行,但会立即关闭调度程序服务。 shutdown方法启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务,也不会等待先前提交的任务完成执行。有时您的调度程序服务在获取任务之前已经关闭,因此它可能会将排队或已完成的任务显示为0。