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

Quarkus中XA事务示例请求:数据库与Artemis消息联动

Quarkus XA事务示例(数据库持久化+Artemis AMQP消息发送)

1. 所需依赖

在pom.xml中添加以下Quarkus扩展,确保支持XA事务、Panache仓库模式及响应式AMQP:

<dependencies>
    <!-- XA事务核心支持 -->
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-narayana-jta</artifactId>
    </dependency>
    <!-- Panache JPA简化操作 -->
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-hibernate-orm-panache</artifactId>
    </dependency>
    <!-- H2数据库XA驱动(测试用,可替换为PostgreSQL等其他XA兼容数据库) -->
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-jdbc-h2</artifactId>
    </dependency>
    <!-- Artemis响应式AMQP(XA兼容) -->
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-artemis-jms-reactive</artifactId>
    </dependency>
    <!-- 响应式消息传递框架 -->
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-smallrye-reactive-messaging-amqp</artifactId>
    </dependency>
</dependencies>

2. application.properties配置

配置数据库XA数据源、Artemis连接及事务属性:

# 数据库XA配置
quarkus.datasource.db-kind=h2
quarkus.datasource.jdbc.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
quarkus.datasource.username=sa
quarkus.datasource.password=
quarkus.datasource.jdbc.xa=true  # 必须开启XA模式

# Hibernate ORM配置
quarkus.hibernate-orm.database.generation=drop-and-create
quarkus.hibernate-orm.log.sql=true

# Artemis AMQP XA配置
quarkus.artemis.url=tcp://localhost:61616
quarkus.artemis.username=admin
quarkus.artemis.password=admin
quarkus.artemis.xa=true  # 开启Artemis XA支持

# 事务超时设置
quarkus.transaction.timeout=30s

# AMQP输出通道配置
mp.messaging.outgoing.orders-out.connector=quarkus-amqp
mp.messaging.outgoing.orders-out.address=orders-queue
mp.messaging.outgoing.orders-out.durable=true

3. 实体类(Panache模式)

创建简单的订单实体:

package com.example;

import io.quarkus.hibernate.orm.panache.PanacheEntity;
import javax.persistence.Entity;

@Entity
public class Order extends PanacheEntity {
    public String orderNumber;
    public double amount;
    public String status;
}

4. Panache仓库类

package com.example;

import io.quarkus.hibernate.orm.panache.PanacheRepository;
import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class OrderRepository implements PanacheRepository<Order> {
    // 继承默认CRUD方法,可按需自定义查询逻辑
}

5. XA事务业务逻辑类

核心逻辑:在同一XA事务中完成数据库持久化和AMQP消息发送,任一操作失败则整体回滚:

package com.example;

import io.smallrye.reactive.messaging.amqp.OutgoingAmqpMetadata;
import org.eclipse.microprofile.reactive.messaging.Channel;
import org.eclipse.microprofile.reactive.messaging.Emitter;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.transaction.Transactional;

@ApplicationScoped
public class OrderService {

    @Inject
    OrderRepository orderRepository;

    @Inject
    @Channel("orders-out")
    Emitter<String> orderEmitter;

    // @Transactional自动触发XA事务管理,协调数据库与Artemis两个资源
    @Transactional
    public void createAndNotifyOrder(String orderNumber, double amount) {
        // 1. 持久化订单到数据库
        Order order = new Order();
        order.orderNumber = orderNumber;
        order.amount = amount;
        order.status = "CREATED";
        orderRepository.persist(order);

        // 2. 发送AMQP消息,消息发送会纳入XA事务
        String message = String.format("Order created: %s, Amount: %.2f", orderNumber, amount);
        OutgoingAmqpMetadata metadata = OutgoingAmqpMetadata.builder()
                .withDurable(true)
                .build();

        orderEmitter.send(message, metadata);
    }
}

关键说明

  • 必须确保数据库和Artemis都开启xa=true配置,否则无法参与XA事务协调
  • @Transactional注解由Quarkus的Narayana事务管理器接管,自动处理两阶段提交(2PC)
  • 若数据库持久化或消息发送任一环节失败,整个事务会回滚:数据库中的订单数据会被撤销,消息也不会发送到Artemis队列

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:42:42