问题描述
我需要在使用Quarkus编写的微服务中使用RabbitMQ的消息。我尝试将 smallrye-reactive-messaging 用于Quarkus,但遇到两个问题:
- 它仅支持AMQP 1.0,并且不支持RabbitMQ(即使我使用实验性AMQP 1.0插件也是如此)。
- 它可以与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
}
}