使用 Quarkus 启动工作线程的正确方法?

Usu*_*sul 9 multithreading background startup worker quarkus

我正在实现 Quarkus 服务器。服务器启动时,应启动一个(永无止境的)后台进程。

@ApplicationScoped我知道我可以使用实现以下功能的 bean 来观察启动事件void onStart(@Observes StartupEvent ev)

但是启动后台进程的最佳方式是什么?有限制吗?在 J2EE 中,不应创建线程,而应使用ManagedExecutorService带有注释方法的 EJB @Asynchronous

Quarkus 里有类似的东西吗?我只找到了调度程序注释(这很好,但我只想在开始时启动一个进程一次)。

那么我可以只创建线程吗?或者只是把我的无限代码放进去void onStart(@Observes StartupEvent ev)

谢谢

小智 5

与在 EJB 中一样,您不应该在后台进程中执行此类操作。框架“失控”的此类进程大多数时候会导致非常烦人的问题。

答案是:这取决于你想在这份工作中做什么。

如果您想定期执行任务,您可以使用计时器。

如果你想将其用作异步工作程序,则可以使用消息队列。

通过将 vert.x 集成到 Quarkus 中,这两个任务都可以轻松完成。

使用@ConsumeEvent创建队列,使用

@Inject
EventBus bus;

bus.send("Example message");
Run Code Online (Sandbox Code Playgroud)

发送消息。

使用 @Scheduled 处理常规作业,如本例所示。

如果您需要永久监听某个套接字或文件,那就会变得更加困难。也许websockets在这种情况下会有帮助。