我想在我的控制器发送响应时启动一个继续工作的线程。这可以用spring-mvc吗?
Best Reagrds, 海因里希
答案 0 :(得分:6)
是的,您可以在Controller中启动新的线程。但是,执行异步作业的更好方法是使用spring-scheduling支持。您可以利用Quartz框架。这将管理你的工作。
此link将为您提供如何将其集成到您的应用程序中。
答案 1 :(得分:5)
是的,它会起作用。在我工作的一个Web应用程序上,我需要根据用户的操作发送通知电子邮件。我在服务上添加了一个post-commit拦截器,并在一个单独的线程中触发了电子邮件。 (在我的情况下,恰好比将代码放在控制器中更清晰,因为我只希望在事务提交时发生。)
你需要确保线程实际上在某个时刻停止运行,或者通过将守护进程设置为true(如果没有通知就停止服务器杀死线程)或者确保其run方法中的代码将始终终止在某些时候。
你最好使用线程池而不是创建新线程,这样你就不会冒资源耗尽的风险(线程停顿通常不是独立的事件,如果一个线程挂起下一个线程可能也会这样,所以你需要一个方法来减少你的损失)。使用@Async注释的方法将使用您可以配置的执行程序执行,如the Spring documentation所示。
答案 2 :(得分:0)
就像其他人提到的那样,它将起作用。 ExecutorService
可以胜任。在这里,您可以看到我用它来启动位于单独端点上的视频流。
@PostMapping("/capture")
public ResponseEntity capture() {
// some code omitted
ExecutorService service = Executors.newCachedThreadPool();
service.submit(() -> startStreaming(deviceConfig));
return return ResponseEntity.ok()
.body(stream);
}