2

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

  1. 它仅支持 AMQP 1.0,不适用于 RabbitMQ(即使我使用的是实验性的 AMQP 1.0 插件)。
  2. 它适用于 ActiveMQ Artemis,但还有另一个问题:smallrye-reactive-messaging 是...响应式,这很好,但现在没有时间将我的数据库代码重写为响应式。处理消息意味着将数以万计的文档持久化到 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 启动时启动一个线程来消费和处理消息。Quarkus支持调度定期任务是否有后台进程的注释或者我必须编写自己的扩展

4

1 回答 1

1

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

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

因此,要在 Quarkus 启动时执行一些代码,您可以StartupEvent在 bean 中观察:

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
        
    }
}
于 2021-01-11T16:09:29.983 回答