在 Quarkus 中启动后台进程

start a background process in Quarkus

我需要在使用 Quarkus 编写的微服务中使用来自 RabbitMQ 的消息。我尝试将 smallrye-reactive-messaging 用于 Quarkus,但遇到了两个问题:

  1. 它仅支持 AMQP 1.0 并且不适用于 RabbitMQ(即使我使用实验性 AMQP 1.0 插件)。
  2. 它适用于 ActiveMQ Artemis,但还有另一个问题:smallrye-reactive-messaging 是... reactive 这很好,但现在没有时间重写我的数据库代码有反应。处理消息意味着将数万个文档持久化到 mongodb,这可能需要几分钟,而且似乎会阻塞整个服务器:

WARNING [io.ver.cor.imp.BlockedThreadChecker] (vertx-blocked-thread-checker) Thread Thread[vert.x-eventloop-thread-0,5,main]=Thread[vert.x-eventloop-thread-0,5,main] has been blocked for 212088 ms, time limit is 2000 ms: io.vertx.core.VertxException: Thread blocked

所以我的解决方法是在 Quarkus 启动时启动一个线程来消费和处理消息。支持调度 periodic tasks in Quarkus is there's an annotation for background processes or do I have to write my own extension?

最后,我通过使用 ActiveMQ Artemis 并使用反应模式重写了我的数据库代码解决了我的问题。另一种方法可能是在 Vert.x.

中使用 io.vertx.rabbitmq.RabbitMQClient

万一有人来这里寻找如何以及在 Quarkus 中启动后台进程的位置,我在 Quarkus Cookbook 一书中找到了答案(第 5.9 章)。在 official documentation.

中还有一个关于 Application Life Cycle Events 的部分

因此,要在 Quarkus 启动时执行一些代码,请观察 bean 中的 StartupEvent

import io.quarkus.runtime.StartupEvent;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Observes;

@ApplicationScoped                                  
public class AppLifeEventListener {
    void onStart(@Observes StartupEvent event) {    
        // start you background thread here
        
    }
}

可以使用外部调度程序在 Quarkus 命令模式 (https://quarkus.io/guides/command-mode-reference) 中启动进程。

在 MongoDB 中有一个批量插入操作,它通过减少往返次数来提高性能。

使用外部调度程序、Quarkus 命令模式和 MongoDB 批量插入进行批处理可以改进对执行的控制并产生更好的资源利用率。