You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus框架中能否使用MDB与EJB消费Artemis Broker消息?

在Quarkus中使用MDB/EJB实现Artemis Broker消息消费的可行性及方案

Quarkus不提供对传统EJB(包括MDB)的完整支持,但可以通过框架扩展生态提供的轻量级替代方案,实现与Artemis Broker的消息交互,达到类似MDB的消息消费效果。以下是具体说明和实现方案:

核心背景

Quarkus主打云原生、轻量级的开发体验,传统EJB的分布式远程调用、复杂生命周期管理等特性不在其核心支持范围内,作为EJB子集的MDB(消息驱动Bean)也没有直接的等价实现。但框架通过扩展提供了更灵活的消息消费方式。

实现Artemis消息消费的两种方案

方案1:基于JMS扩展 + CDI替代MDB

通过quarkus-artemis-jms扩展,结合CDI Bean实现消息监听,行为接近传统MDB:

  1. 添加Maven依赖:
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-artemis-jms</artifactId>
</dependency>
  1. 创建CDI Bean实现MessageListener:
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.jms.JMSException;
import jakarta.jms.Message;
import jakarta.jms.MessageListener;
import jakarta.transaction.Transactional;

@ApplicationScoped
public class ArtemisJmsConsumer implements MessageListener {

    @Override
    @Transactional // 可选,实现消息消费的事务控制
    public void onMessage(Message message) {
        try {
            String payload = message.getBody(String.class);
            // 自定义消息处理逻辑
            System.out.println("Received JMS message: " + payload);
        } catch (JMSException e) {
            // 异常处理,比如重试或转发到死信队列
            throw new RuntimeException("Failed to process message", e);
        }
    }
}
  1. 配置Artemis连接(application.properties):
quarkus.artemis.url=tcp://localhost:61616
quarkus.artemis.username=admin
quarkus.artemis.password=admin
# 绑定监听的队列与消费Bean
quarkus.artemis.jms.listener.my-queue.queue=my-queue
quarkus.artemis.jms.listener.my-queue.message-listener=com.example.ArtemisJmsConsumer

方案2:基于Reactive Messaging(推荐云原生场景)

使用Quarkus与SmallRye Reactive Messaging集成的Artemis扩展,更适合异步、高并发的云原生环境:

  1. 添加Maven依赖:
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-smallrye-reactive-messaging-artemis</artifactId>
</dependency>
  1. 创建消费Bean,用@Incoming注解绑定Artemis目的地:
import jakarta.enterprise.context.ApplicationScoped;
import org.eclipse.microprofile.reactive.messaging.Incoming;
import jakarta.transaction.Transactional;

@ApplicationScoped
public class ReactiveArtemisConsumer {

    @Incoming("artemis-incoming")
    @Transactional // 可选,支持事务控制
    public void consumeMessage(String payload) {
        // 处理消息逻辑
        System.out.println("Received reactive message: " + payload);
    }
}
  1. 配置文件(application.properties):
mp.messaging.incoming.artemis-incoming.connector=smallrye-artemis
mp.messaging.incoming.artemis-incoming.host=localhost
mp.messaging.incoming.artemis-incoming.port=61616
mp.messaging.incoming.artemis-incoming.username=admin
mp.messaging.incoming.artemis-incoming.password=admin
mp.messaging.incoming.artemis-incoming.destination=my-queue

补充说明

如果需要传统EJB的事务特性,Quarkus支持Jakarta Transaction(JTA),通过@Transactional注解可以实现消息消费的事务控制——当消费逻辑抛出异常时,消息会回滚到Artemis Broker,和MDB的事务行为一致。

内容的提问来源于stack exchange,提问作者Tabrez Mohammed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 16:45:03