在Quarkus中启动后台进程

问题描述

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

  1. 它仅支持AMQP 1.0,并且不支持RabbitMQ(即使我使用实验性AMQP 1.0插件也是如此)。
  2. 它可以与ActiveMQ Artemis一起使用,但是还有另一个问题:smallrye-reactive-messaging是... reactive 这很不错,但是现在没有时间重写我的数据库代码以进行响应。处理该消息意味着将数万个文档保存到mongodb中,这可能需要几分钟,而且似乎阻塞了整个服务器:

警告[io.ver.cor.imp.BlockedThreadChecker] (vertx-blocked-thread-checker)线程 Thread [vert.x-eventloop-thread-0,5,main] = Thread [vert.x-eventloop-thread-0,5,main] 已被阻止212088毫秒,时间限制为2000毫秒: io.vertx.core.VertxException:线程被阻止

因此,我的解决方法是启动一个线程,以便在启动时使用和处理Quarkus中的消息。支持调度periodic tasks in Quarkus,是否有用于后台进程的注释,还是我必须写own extension

解决方法

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

如果有人来这里寻找可以在 Quarkus 中启动后台进程的方式和位置,我在 Quarkus Cookbook(第 5.9 章)一书中找到了答案。 official documentation 中还有一个关于应用程序生命周期事件的部分。

所以要在 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
        
    }
}