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
相关产品推荐
相关产品推荐

