2.57. JMS


发送和接收到 JMS Queue 或 Topic 的消息。

2.57.1. 什么是内部

  • JMS 组件, URI 语法: jms:destinationType:destinationName

有关用法和配置详情,请参阅上述链接。

2.57.2. Maven 协调

在 code.quarkus.redhat.com 上使用此扩展创建新项目

或者将协调添加到现有项目中:

<dependency>
    <groupId>org.apache.camel.quarkus</groupId>
    <artifactId>camel-quarkus-jms</artifactId>
</dependency>

2.57.3. 使用方法

2.57.3.1. 使用 org.w3c.dom.Node的消息映射

Camel JMS 组件支持 jakarta.jms.Messageorg.apache.camel.Message 之间的消息映射。当希望转换 org.w3c.dom.Node 的 Camel 消息正文类型时,您必须确保 classpath 上存在 camel-quarkus-xml-jaxp 扩展。

将 JMS 消息有效负载作为 jakarta.jms.ObjectMessage 发送时,您必须注解要注册的相关类,以便使用 @RegisterForReflection (serialization = true) 进行了注册。请注意,此扩展会自动为您设置 quarkus.camel.native.reflection.serialization-enabled = true。如需更多信息,请参阅 原生模式用户指南

2.57.3.3. 支持连接池和 X/Open XA 分布式事务

注意

此 {project-name} 发行版本中的连接池是技术预览功能。

要在 camel-quarkus-jms 组件中使用连接池,您必须将 io.quarkiverse.artemis:quarkus-artemisio.quarkiverse.messaginghub:quarkus-pooled-jms 添加到 pom.xml 中,并设置以下配置:

quarkus.pooled-jms.max-connections = 8

您可以使用 quarkus-pooled-jms 扩展来获取对 JMS 连接的池和 XA 支持。如需更多信息,请参阅 quarkus-pooled-jms 扩展文档。目前,它可用于 quarkus-artemis-jmsquarkus-qpid-jmsibmmq-client。只需将依赖项添加到 pom.xml 中:

<dependency>
    <groupId>io.quarkiverse.messaginghub</groupId>
    <artifactId>quarkus-pooled-jms</artifactId>
</dependency>

默认启用池。

注意

池连接不支持 clientIDdurableSubscriptionName。如果在池 重复使用 的连接上调用 setClientID,则会抛出 IllegalStateException。您会得到一些错误消息,如 Cause: setClientID,只能在创建连接后直接调用

要启用 XA,您需要添加 quarkus-narayana-jta 扩展:

<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-narayana-jta</artifactId>
</dependency>

并将以下配置添加到 application.properties 中:

quarkus.pooled-jms.transaction=xa
quarkus.transaction-manager.enable-recovery=true

XA 支持仅适用于 quarkus-artemis-jmsibmmq-client。另外,我们强烈建议您启用事务恢复。

由于目前没有 ibmmq-client 的 quarkus 扩展,您需要创建自定义 ConnectionFactory 并自行嵌套。下面是一个示例:

@Produces
public ConnectionFactory createXAConnectionFactory(PooledJmsWrapper wrapper) {
    MQXAConnectionFactory mq = new MQXAConnectionFactory();
    try {
        mq.setHostName(ConfigProvider.getConfig().getValue("ibm.mq.host", String.class));
        mq.setPort(ConfigProvider.getConfig().getValue("ibm.mq.port", Integer.class));
        mq.setChannel(ConfigProvider.getConfig().getValue("ibm.mq.channel", String.class));
        mq.setQueueManager(ConfigProvider.getConfig().getValue("ibm.mq.queueManagerName", String.class));
        mq.setTransportType(WMQConstants.WMQ_CM_CLIENT);
        mq.setStringProperty(WMQConstants.USERID,
            ConfigProvider.getConfig().getValue("ibm.mq.user", String.class));
        mq.setStringProperty(WMQConstants.PASSWORD,
            ConfigProvider.getConfig().getValue("ibm.mq.password", String.class));
    } catch (Exception e) {
        throw new RuntimeException("Unable to create new IBM MQ connection factory", e);
    }
    return wrapper.wrapConnectionFactory(mq);
}
注意

如果您使用 ibmmq-client 使用消息并启用 XA,您需要在 camel 路由中配置 TransactionManager,如下所示:

@Inject
TransactionManager transactionManager;

@Override
public void configure() throws Exception {
    from("jms:queue:DEV.QUEUE.XA?transactionManager=#jtaTransactionManager");
}

@Named("jtaTransactionManager")
public PlatformTransactionManager getTransactionManager() {
    return new JtaTransactionManager(transactionManager);
}

否则,您将收到一个例外,如 MQRC_SYNCPOINT_NOT_AVAILABLE

注意

当您使用 ibmmq-client 并回滚事务时,会出现如下 WARN 消息:

WARN  [com.arj.ats.jta] (executor-thread-1) ARJUNA016045: attempted rollback of < formatId=131077, gtrid_length=35, bqual_length=36, tx_uid=0:ffffc0a86510:aed3:650915d7:16, node_name=quarkus, branch_uid=0:ffffc0a86510:aed3:650915d7:1f, subordinatenodename=null, eis_name=0 > (com.ibm.mq.jmqi.JmqiXAResource@79786dde) failed with exception code XAException.XAER_NOTA: javax.transaction.xa.XAException: The method 'xa_rollback' has failed with errorCode '-4'.
it may be ignored and can be assumed that MQ has discarded the transaction's work. Refer to https://access.redhat.com/solutions/1250743[Red Hat Knowledgebase] for more information.

2.57.4. 原生模式中的 transferException 选项

要在原生模式中使用 transferException 选项,您必须启用对对象序列化的支持。如需更多信息,请参阅 原生模式用户指南

您还需要为您要序列化的异常类启用序列化功能。例如:

@RegisterForReflection(targets = { IllegalStateException.class, MyCustomException.class }, serialization = true)
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部