2017-08-25 106 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