2017-08-25 107 views
0

ScheduledExecutorService用于bean构造函数,它应该在spring启动时运行。junit spring引导ScheduledExecutorService计划不运行

@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

回答

0

您可能延迟控制线等待与呼叫调度的线程的执行,以

scheduledFuture.get() or 
scheduledFuture.get(long timeout, TimeUnit unit), 

其中

scheduledFuture = service.schedule(..) 

service.shutdown(). 

之前,您正在计划到另一个线程中运行任务,但立即关闭调度服务。 shutdown方法启动一个有序的关闭,其中执行先前提交的任务,但不会接受新任务,并且不会等待先前提交的任务完成执行。可能发生的情况是,有时您的调度程序服务在获取任务之前已关闭,因此它显示排队或已完成的任务为0.

+0

我不认为关机会导致问题。因为断点是在它之前设置的。 – Tiina