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() {
}
}
答案 0 :(得分:0)
您可以通过调用
来延迟控制器线程以等待执行预定线程scheduledFuture.get() or
scheduledFuture.get(long timeout, TimeUnit unit),
其中
scheduledFuture = service.schedule(..)
之前
service.shutdown().
您正在安排任务在另一个线程中运行,但会立即关闭调度程序服务。 shutdown方法启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务,也不会等待先前提交的任务完成执行。有时您的调度程序服务在获取任务之前已经关闭,因此它可能会将排队或已完成的任务显示为0。