使用 AMQ 核心协议 JMS 客户端


Red Hat AMQ Clients 2.11

用于 AMQ Clients 2.11

摘要

本指南介绍了如何安装和配置客户端,运行实践示例,并将您的客户端用于其他 AMQ 组件。

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息

第 1 章 概述

AMQ 核心协议 JMS 是一个 Java 消息服务(JMS) 2.0 客户端,用于发送和接收 Artemis 核心协议消息的消息传递应用。

AMQ 核心协议 JMS 是 AMQ 客户端的一部分,这是支持多种语言和平台的消息传递库套件。有关客户端的概述,请参阅 AMQ 客户端概述。有关本发行版本的详情,请查看 AMQ Clients 2.11 发行注记

AMQ 核心协议 JMS 基于 Apache ActiveMQ Artemis 的 JMS 实施。有关 JMS API 的更多信息,请参阅 JMS API 参考JMS 指南

1.1. 主要特性

  • JMS 1.1 和 2.0 兼容
  • 用于安全通信的 SSL/TLS
  • 自动重新连接和故障转移
  • 分布式事务(XA)
  • 纯 Java 的实现

1.2. 支持的标准和协议

AMQ 核心协议 JMS 支持以下行业标准和网络协议:

1.3. 支持的配置

有关 AMQ 核心协议 JMS 支持的配置,请参阅红帽客户门户网站中的 Red Hat AMQ 支持的配置。

1.4. 术语和概念

本节介绍核心 API 实体,并描述了它们如何协同工作。

表 1.1. API 术语
实体描述

ConnectionFactory

创建连接的入口点。

连接

用于网络上两个对等点间的通信频道。它包含会话。

会话

生成和使用消息的上下文。它包含消息制作者和消费者。

MessageProducer

用于发送消息到目的地的频道。它有一个目标目的地。

MessageConsumer

从目的地接收消息的频道。它有一个源目的地。

目的地

消息的命名位置,可以是队列或主题。

队列

存储的消息序列。

Topic

用于多播分发的消息序列。

消息

特定于应用程序的信息。

AMQ 核心协议 JMS 发送并 接收消息消息使用消息制作者 和消费者 在连接的对等点间传输。生产者和消费者是通过 会话 建立的。会话通过连接 建立。连接通过 连接工厂 创建。

发送 peer 创建用于发送消息的制作者。制作者有一个 目的地,用于标识远程对等点的目标队列或主题。接收对等点会创建一个接收消息的消费者。与生成者一样,消费者有一个目的地,用于标识远程对等点的源队列或主题。

目的地可以是 队列,也可以是 主题。在 JMS 中,队列和主题是保存消息的命名代理实体的客户端表示。

队列实施点到点语义。每个消息仅由一个使用者看到,消息会在读取后从队列中删除。主题实施发布订阅语义。每个消息都由多个消费者看到,消息在读取后仍可供其他消费者使用。

如需更多信息,请参阅 JMS 指南

1.5. 文档惯例

sudo 命令

在本文档中,sudo 用于任何需要 root 特权的命令。使用 sudo 时请小心谨慎,因为任何更改都可能会影响整个系统。有关 sudo 的更多信息,请参阅使用 sudo 命令

文件路径

在本文档中,所有文件路径对 Linux、UNIX 和类似操作系统(例如 /home/andrea)有效。在 Microsoft Windows 上,您必须使用等同的 Windows 路径(例如 C:\Users\andrea)。

变量文本

本文档包含代码块,带有必须替换为特定于环境的值的变量。变量文本用箭头键括起,样式为斜体 monospace。例如,在以下命令中,将 < project-dir& gt; 替换为您的环境的值:

$ cd <project-dir>

第 2 章 安装

本章指导您完成在环境中安装 AMQ 核心协议 JMS 的步骤。

2.1. 先决条件

  • 您必须有一个 订阅 才能访问 AMQ 发行版本文件和软件仓库。
  • 要使用 AMQ 核心协议 JMS 构建程序,您必须安装 Apache Maven
  • 要使用 AMQ 核心协议 JMS,您必须安装 Java。

2.2. 使用红帽 Maven 存储库

配置 Maven 环境,以从 Red Hat Maven 存储库下载客户端库。

流程

  1. 将红帽存储库添加到您的 Maven 设置或 POM 文件中。有关配置文件示例,请参阅 第 B.1 节 “使用在线存储库”

    <repository>
      <id>red-hat-ga</id>
      <url>https://maven.repository.redhat.com/ga</url>
    </repository>
  2. 将库依赖项添加到 POM 文件中。

    <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>artemis-jms-client</artifactId>
      <version>2.18.0.redhat-00021</version>
    </dependency>

客户端现在在 Maven 项目中可用。

2.3. 安装本地 Maven 存储库

作为在线存储库的替代选择,AMQ 核心协议 JMS 可以作为基于文件的 Maven 存储库安装到本地文件系统中。

流程

  1. 使用您的订阅 下载 AMQ Broker 7.9.0 Maven 存储库 .zip 文件。
  2. 将文件内容提取到您选择的目录中。

    在 Linux 或 UNIX 上,使用 unzip 命令提取文件内容。

    $ unzip amq-broker-7.9.0-maven-repository.zip

    在 Windows 上,右键单击 .zip 文件并选择 Extract All

  3. 将 Maven 配置为使用提取的安装目录中的 maven-repository 目录中的存储库。如需更多信息,请参阅 第 B.2 节 “使用本地存储库”

2.4. 安装示例

流程

  1. 使用您的订阅 下载 AMQ Broker 7.9.0 .zip 文件。
  2. 将文件内容提取到您选择的目录中。

    在 Linux 或 UNIX 上,使用 unzip 命令提取文件内容。

    $ unzip amq-broker-7.9.0.zip

    在 Windows 上,右键单击 .zip 文件并选择 Extract All

    当您提取 .zip 文件的内容时,会创建一个名为 amq-broker-7.9.0 的目录。这是安装的顶级目录,在整个文档中称为 < install-dir& gt;。

第 3 章 开始使用

本章指导您完成设置环境并运行简单消息传递程序的步骤。

3.1. 先决条件

3.2. 运行您的第一个示例

这个示例为名为 exampleQueue 的队列创建一个消费者和制作者。它发送文本消息,然后接收它,并将收到的消息打印到控制台。

流程

  1. 通过在 < install-dir> /examples/features/standard/queue 目录中运行以下命令来构建示例。

    $ mvn clean package dependency:copy-dependencies -DincludeScope=runtime -DskipTests

    添加 dependencies :copy-dependencies 会导致依赖项 复制到目标/依赖 目录中。

  2. 使用 java 命令运行示例。

    对于 Linux 或 UNIX:

    $ java -cp "target/classes:target/dependency/*" org.apache.activemq.artemis.jms.example.QueueExample

    对于 Windows:

    > java -cp "target\classes;target\dependency\*" org.apache.activemq.artemis.jms.example.QueueExample

例如,在 Linux 中运行它会产生以下输出:

$ java -cp "target/classes:target/dependency/*" org.apache.activemq.artemis.jms.example.QueueExample
Sent message: This is a text message
Received message: This is a text message

示例的源代码位于 < install-dir> /examples/features/standard/queue/src 目录中。< install-dir&gt; /examples/features/standard 目录中提供了 其他示例。

第 4 章 Configuration

本章论述了将 AMQ 核心协议 JMS 实现绑定到 JMS 应用并设置配置选项的过程。

JMS 使用 Java 命名目录接口(JNDI)来注册和查找 API 实现和其他资源。这可让您将代码写入 JMS API,而不将其放入特定的实现中。

配置选项作为连接 URI 上的查询参数公开。

4.1. 配置 JNDI 初始上下文

JMS 应用使用从 InitialContext Factory 获取的 JNDI InitialContext 对象来查找 JMS 对象,如连接工厂。AMQ Core Protocol JMS 在 org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory 类中提供 InitialContextFactory 的实现。

InitialContext 对象实例化时,会发现 InitialContextFactory 实现:

javax.naming.Context context = new javax.naming.InitialContext();

要查找实施,必须在您的环境中配置 JNDI。实现这一点的三种方法:使用 jndi.properties 文件、使用系统属性或使用初始上下文 API。

使用 jndi.properties 文件

创建名为 jndi.properties 的文件,并将其放在 Java 类路径上。使用键 java.naming.factory.initial 添加属性。

示例:使用 jndi.properties 文件设置 JNDI 初始上下文工厂

java.naming.factory.initial = org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory

在基于 Maven 的项目中,jndi.properties 文件放置在 < project-dir> /src/main/resources 目录中。

使用系统属性

设置 java.naming.factory.initial 系统属性。

示例:使用系统属性设置 JNDI 初始上下文工厂

$ java -Djava.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory ...

使用初始上下文 API

使用 JNDI 初始上下文 API 以编程方式设置属性。

示例:以编程方式设置 JNDI 属性

Hashtable<Object, Object> env = new Hashtable<>();

env.put("java.naming.factory.initial", "org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory");

InitialContext context = new InitialContext(env);

请注意,您可以使用相同的 API 为连接工厂、队列和主题设置 JNDI 属性。

4.2. 配置连接工厂

JMS 连接工厂是创建连接的入口点。它使用连接 URI 来编码特定于应用程序的配置设置。

要设置工厂名称和连接 URI,以以下格式创建一个属性。您可以将此配置存储在 jndi.properties 文件中,或者设置对应的系统属性。

连接工厂的 JNDI 属性格式

connectionFactory.<lookup-name> = <connection-uri>

例如,您可以配置名为 app1 的工厂:

示例:在 jndi.properties 文件中设置连接工厂

connectionFactory.app1 = tcp://example.net:61616?clientID=backend

然后,您可以使用 JNDI 上下文使用名称 app1 查找配置的连接工厂:

ConnectionFactory factory = (ConnectionFactory) context.lookup("app1");

4.3. 连接 URI

连接使用连接 URI 进行配置。连接 URI 指定远程主机、端口和一组配置选项,这些选项被设置为查询参数。有关可用选项的详情请参考 第 5 章 配置选项

连接 URI 格式

tcp://<host>:<port>[?<option>=<value>[&<option>=<value>...]]

例如,以下是连接到主机 example.net 的端口 616 的连接 URI,并将客户端 ID 设置为 backend

示例:连接 URI

tcp://example.net:61616?clientID=backend

除了 tcp 外,AMQ 核心协议 JMS 还支持 vmudpjgroups 方案。它们代表备用传输,并在代理上具有相应的 acceptor 配置。

故障转移 URI

URI 可以包含多个目标连接 URI。如果初始连接到一个目标失败,则尝试另一个目标。它们采用以下格式:

故障转移 URI 格式

(<connection-uri>[,<connection-uri>])[?<option>=<value>[&<option>=<value>...]]

括号外的选项适用于所有连接 URI。

4.4. 配置队列和主题名称

JMS 提供了使用 JNDI 来查找特定于部署队列和主题资源的选项。

要在 JNDI 中设置队列和主题名称,以以下格式创建属性:将此配置放在 jndi.properties 文件中,或设置对应的系统属性。

队列和主题的 JNDI 属性格式

queue.<lookup-name> = <queue-name>
topic.<lookup-name> = <topic-name>

例如,以下属性定义了两个部署特定资源的名称 作业 和通知

示例:在 jndi.properties 文件中设置队列和主题名称

queue.jobs = app1/work-items
topic.notifications = app1/updates

然后,您可以通过其 JNDI 名称查找资源:

Queue queue = (Queue) context.lookup("jobs");
Topic topic = (Topic) context.lookup("notifications");

第 5 章 配置选项

本章列出了 AMQ 核心协议 JMS 的可用选项。

JMS 配置选项设置为连接 URI 上的查询参数。如需更多信息,请参阅 第 4.3 节 “连接 URI”

5.1. 常规选项

user
客户端用来验证连接的用户名。
password
客户端用来验证连接的密码。
clientID
客户端应用到连接的客户端 ID。
groupID
客户端适用于所有生成的消息的组 ID。
autoGroup
如果启用,生成随机组 ID,并将其应用到所有生成的消息。
preAcknowledge
如果启用,在发送后马上确认消息,并在发送完成前马上确认信息。这提供了"最多一次"交付。它默认是禁用的。
blockOnDurableSend
如果启用,在发送不可转换的持久消息时,块直到远程对等点确认接收为止。它会被默认启用。
blockOnNonDurableSend
如果启用,在发送非翻译时,块直到远程对等点确认接收为止。它默认是禁用的。
blockOnAcknowledge
如果启用,当确认非转换收到的消息时,块直到远程对等确认确认为止。它默认是禁用的。
callTimeout
等待阻塞调用完成的时间(毫秒)。默认值为 30000 (30 秒)。
callFailoverTimeout
当客户端正在进行故障时,millisconds 中的时间在启动阻塞调用前等待。默认值为 30000 (30 秒)。
ackBatchSize
在确认发送到代理前,客户端可以接收和确认的字节数。默认值为 1048576 (1 MiB)。
dupsOKBatchSize
使用 DUPS_OK_ACKNOWLEDGE 确认模式时,确认批处理的大小(以字节为单位)。默认值为 1048576 (1 MiB)。
transactionBatchSize
在交易中收到 messsages 时,确认批处理的大小(以字节为单位)。默认值为 1048576 (1 MiB)。
cacheDestinations
如果启用,缓存目的地查找。它默认是禁用的。

5.2. TCP 选项

tcpNoDelay
如果启用,请不要延迟和缓冲区 TCP 发送。它会被默认启用。
tcpSendBufferSize
发送缓冲区大小(以字节为单位)。默认值为 32768 (32 KiB)。
tcpReceiveBufferSize
接收缓冲区大小(以字节为单位)。默认值为 32768 (32 KiB)。
writeBufferLowWaterMark
写入缓冲区的以字节为单位的限制,以字节为单位。默认值为 32768 (32 KiB)。
writeBufferHighWaterMark
上面写入缓冲区的限制(以字节为单位)。默认值为 131072 (128 KiB)。

5.3. SSL/TLS 选项

sslEnabled
如果启用,请使用 SSL/TLS 验证和加密连接。它默认是禁用的。
keyStorePath
SSL/TLS 密钥存储的路径。mutual SSL/TLS 身份验证需要密钥存储。如果未设置,则使用 javax.net.ssl.keyStore 系统属性的值。
keyStorePassword
SSL/TLS 密钥存储的密码。如果未设置,则使用 javax.net.ssl.keyStorePassword 系统属性的值。
trustStorePath
SSL/TLS 信任存储的路径。如果未设置,则使用 javax.net.ssl.trustStore 系统属性的值。
trustStorePassword
SSL/TLS 信任存储的密码。如果未设置,则使用 javax.net.ssl.trustStorePassword 系统属性的值。
trustAll
如果启用,请隐式信任提供的服务器证书,无论任何配置的信任存储是什么。它默认是禁用的。
verifyHost
如果启用,请验证连接主机名是否与提供的服务器证书匹配。它默认是禁用的。
enabledCipherSuites
要启用的密码套件的逗号分隔列表。如果未设置,则使用 JVM 默认密码。
enabledProtocols
要启用的 SSL/TLS 协议的逗号分隔列表。如果未设置,则使用 JVM 默认协议。

5.4. 故障转移选项

initialConnectAttempts
在第一个成功连接前允许的重新连接尝试次数,并在客户端发现代理拓扑前允许。默认值为 0,表示只允许一个尝试。
failoverOnInitialConnection
如果启用,如果初始连接失败,请尝试连接到备份服务器。它默认是禁用的。
reconnnectAttempts
在将连接报告为失败前允许的重新连接尝试次数。默认值为 -1,表示没有限制。
retryInterval
重新连接尝试之间的时间(毫秒)。默认值为 2000 (2 秒)。
retryIntervalMultiplier
用于增加重试间隔的倍数。默认值为 1.0,即相等的间隔。
maxRetryInterval
重新连接尝试之间的最长时间(毫秒)。默认值为 2000 (2 秒)。
ha
如果启用,请跟踪 HA 代理拓扑中的更改。URI 中的主机和端口仅用于初始连接。在初始连接后,客户端会收到当前的故障转移端点以及拓扑更改导致的任何更新。它默认是禁用的。
connectionTTL
服务器没有 ping 数据包时连接失败的时间(毫秒)。默认值为 60000 (1 分钟)。-1 禁用超时。
confirmationWindowSize
命令重播缓冲区的大小(以字节为单位)。这用于重新连接时自动会话重新提供。默认值为 -1,即没有自动重新提供。
clientFailureCheckPeriod
检查死连接之间的时间(毫秒)。默认值为 30000 (30 秒)。-1 禁用检查。

5.5. 流控制选项

如需更多信息,请参阅 第 8 章 流控制

consumerWindowSize
每个消费者消息大小(以字节为单位)。默认值为 1048576 (1 MiB)。-1 代表没有限制。0 禁用 prefetching。
consumerMaxRate
每秒消耗的最大消息数。默认值为 -1,表示没有限制。
producerWindowSize
信用卡生成更多消息的请求大小(以字节为单位)。这限制一次处于 flight 的数据量。默认值为 1048576 (1 MiB)。-1 代表没有限制。
producerMaxRate
每秒生成的最大消息数。默认值为 -1,表示没有限制。

5.6. 负载平衡选项

useTopologyForLoadBalancing
如果启用,使用集群拓扑进行连接负载均衡。它会被默认启用。
connectionLoadBalancingPolicyClassName
连接负载均衡策略的类名称。默认为 org.apache.activemq.artemis.api.core.client.loadbalance.RoundRobinConnectionLoadBalancingPolicy

5.7. 大消息选项

客户端可以通过为属性 minLargeMessageSize 设置值来启用大型消息支持。任何大于 minLargeMessageSize 的消息都被视为大型消息。

minLargeMessageSize
消息被视为大消息的最小大小(以字节为单位)。默认值为 102400 (100 KiB)。
compressLargeMessages

如果启用,压缩由 minLargeMessageSize 定义的大型消息。它默认是禁用的。如果大消息的压缩大小小于 minLargeMessageSize 的值,则消息将作为常规消息发送,且不会写入代理的大型消息数据目录。压缩和解压缩消息的过程会导致客户端的额外 CPU 使用量。

注意

只有 AMQ Core Protocol JMS 客户端支持消息压缩。

5.8. 线程选项

useGlobalPools
如果启用,请对所有 ConnectionFactory 实例使用一个线程池。否则,请为每个实例使用单独的池。它会被默认启用。
threadPoolMaxSize
常规线程池中的最大线程数量。默认值为 -1,表示没有限制。
scheduledThreadPoolMaxSize
线程池中调度操作的最大线程数量。默认值为 5。

第 6 章 网络连接

6.1. 自动故障切换

客户端可以接收有关所有主和从属代理的信息,以便在连接失败时,它可以重新连接到从代理。然后,从代理会自动重新创建每个连接上存在的会话和消费者,然后再故障转移。此功能可以在应用程序中手动重新连接逻辑。

在从中重新创建会话时,它不知道已经发送或确认的消息。故障转移时任何动态发送或确认都可能会丢失。但是,即使没有透明故障转移,也很简单地保证 一次和一次 交付,即使在出现重复检测和重试事务时也是如此。

当客户端在可配置的时间段内没有从代理接收数据包时,客户端会检测连接失败。请参阅 第 6.3 节 “检测死连接” 了解更多信息。

您可以通过多种方式配置客户端来接收关于主设备和从系统的信息。一种选择将客户端配置为连接到特定代理,然后接收集群中其他代理的信息。请参阅 第 6.7 节 “配置静态发现” 了解更多信息。但是,最常见的方法是使用代理 发现。有关如何配置代理发现的详情,请参考 第 6.6 节 “配置动态发现”

另外,您可以通过在用于连接代理的 URI 的查询字符串中添加参数来配置客户端,如下例所示。

connectionFactory.ConnectionFactory=tcp://localhost:61616?ha=true&reconnectAttempts=3

流程

要使用查询字符串配置客户端以进行故障转移,请确保正确设置 URI 的以下组件:

  1. URI 的 host:port 部分必须指向使用备份正确配置的 master 代理。此主机和端口仅用于初始连接。host:port 值没有与 live 和备份服务器之间实际连接故障转移无关。在上例中,localhost:61616 用于 host:port
  2. (可选)要将多个代理用作可能的初始连接,请对 host:port 条目进行分组,如下例所示:

    connectionFactory.ConnectionFactory=(tcp://host1:port,tcp://host2:port)?ha=true&reconnectAttempts=3
  3. 将 name-value 对 ha=true 作为查询字符串的一部分,以确保客户端接收集群中每个主和从属代理的信息。
  4. 包含 reconnectAttempts=n 的 name-value 对,其中 n 是一个大于 0 的整数。此参数设置客户端尝试重新连接到代理的次数。
注意

只有 ha=truereconnectAttempts 大于 0 时,才会进行故障转移。另外,客户端必须初始连接到 master 代理,才能接收有关其他代理的信息。如果初始连接失败,客户端只能重试来建立它。请参阅 第 6.1.1 节 “在初始连接过程中失败” 了解更多信息。

6.1.1. 在初始连接过程中失败

因为客户端不会在第一次连接到 HA 集群后收到每个代理的信息,因此有一个窗口,客户端只能连接到连接 URI 中包含的代理。因此,如果此初始连接期间出现故障,客户端无法切换到其他 master 代理,但只能尝试重新建立初始连接。可以为一组重新连接尝试配置客户端。尝试次数后,会抛出异常。

设置重新连接尝试次数

以下示例演示了如何使用 AMQ 核心协议 JMS 客户端将重新连接尝试数设置为 3。默认值为 0,即只尝试一次。

流程

通过将值传递给 ServerLocator.setInitialConnectAttempts () 来设置重新连接尝试次数。

ConnectionFactory cf =  ActiveMQJMSClient.createConnectionFactory(...)
cf.setInitialConnectAttempts(3);
设置全局重新连接尝试

另外,您可以为代理配置中重新连接尝试的最大数应用全局值。最大值适用于所有客户端连接。

流程

通过添加 initial -connect-attempts 配置元素并为 time-to-live 提供值来编辑 <broker-instance-dir>/etc/broker.xml,如下例所示。

<configuration>
 <core>
  ...
  <initial-connect-attempts>3</initial-connect-attempts> 1
  ...
 </core>
</configuration>
1
所有连接到代理的客户端都允许最多三个尝试重新连接。默认值为 -1,它允许客户端无限尝试。

6.1.2. 处理故障切换期间阻止调用

当发生故障转移并且客户端正在等待代理继续执行其响应时,新创建的会话不知道正在进行的调用。否则,初始调用可能会永久挂起,等待永不出现的响应。为防止这种情况,代理旨在取消阻塞任何在故障切换时正在进行的调用,方法是使它们抛出异常。客户端代码可以捕获这些例外,并在需要时重试任何操作。

使用 AMQ 核心协议 JMS 客户端时,如果未阻塞的方法是 commit ()prepare () 的调用,则事务会自动回滚,代理会抛出异常。

6.1.3. 使用事务处理故障切换

在使用 AMQ 核心协议 JMS 客户端时,如果会话是事务的,且消息已在当前事务中发送或确认,代理无法确保这些消息或确认在故障切换过程中丢失。因此,事务仅标记为回滚。任何后续尝试提交它都会抛出 javax.jms.TransactionRolledBackException

警告

此规则的注意事项是使用 XA 时。如果使用了两阶段提交并已调用 prepare (),则回滚可能会导致 HeuristicMixedException。因此,提交会抛出 XAException.XA_RETRY 异常,它会通知交易管理器,它应该稍后重试提交。如果没有发生原始提交,它仍然存在,并可提交。如果提交不存在,则假定已提交了,但事务管理器可能会记录警告。这个异常的副作用是,任何非持久性信息都会丢失。为避免此类丢失,在使用 XA 时始终使用持久性消息。这不是确认问题,因为它们在调用 prepare () 前将其刷新到代理。

AMQ 核心协议 JMS 客户端代码必须捕获异常并执行任何必要的客户端侧回滚。但是,不需要回滚会话,因为它已经回滚。然后,用户可以再次在同一会话上重试事务操作。

如果在执行提交调用时发生故障转移,代理会取消阻塞调用,以防止 AMQ Core Protocol JMS 客户端无限期等待响应。因此,在失败前,客户端无法决定事务提交是否实际在主代理中处理。

要修复这一点,AMQ Core Protocol JMS 客户端可以在事务中启用重复的检测,并在未阻塞后再次重试事务操作。如果在故障转移前成功在 master 代理上提交事务,则重复检测可确保事务中忽略了代理端的任何显著消息。这可防止消息被多次发送。

如果会话不是事务性,则在故障转移时可能会丢失消息或确认。如果要提供一次,且只为非转换会话提供一次 交付保证,请启用重复的检测并捕获未阻塞异常。

6.1.4. 收到连接失败的通知

JMS 提供了异步获得连接故障通知的标准机制: java.jms.ExceptionListener

如果发生连接失败,代理始终调用任何 ExceptionListenerSessionFailureListener 实例,无论连接是否成功失败、重新连接或重新附加。您可以通过检查 SessionFailureListener 上的 connectionFailed 上传递的 failedOver 标志来找出是否发生了重新连接或重新附加。或者,您可以检查 javax.jms.JMSException 的错误代码,可以是以下之一:

表 6.1. JMSException 错误代码
错误代码描述

FAILOVER

发生故障转移,代理已成功重新附加或重新连接

DISCONNECT

没有发生故障转移,代理断开连接

6.2. 应用程序级别的故障切换

在某些情况下,您可能不希望自动客户端故障转移,但更喜欢在失败处理程序中对您自己的重新连接逻辑进行编码。这称为 应用程序级别的 故障切换,因为故障转移是在应用程序级别处理的。

要在使用 JMS 时实施应用级别的故障切换,请在 JMS 连接上设置 ExceptionListener 类。在检测到连接失败时,代理会调用 ExceptionListener。在 ExceptionListener 中,您应该关闭旧的 JMS 连接。您可能还希望从 JNDI 查找新的连接工厂实例并创建新的连接。

6.3. 检测死连接

只要它从代理接收数据,客户端会认为连接处于活动状态。通过为 client-failure-check-period 属性提供值,将客户端配置为检查其连接是否有失败。网络连接的默认检查周期为 30,000 毫秒或 30 秒,而 in-VM 连接的默认值为 -1,这意味着,如果没有接收数据,客户端永远不会从侧失败连接。

通常,您将检查周期设置为小于代理连接时间到实时的值,这样可确保在出现临时故障时客户端可以重新连接。

为检测死连接设置检查周期

以下示例演示了如何将检查周期设置为 10,000 毫秒。

流程

  • 如果您使用 JNDI,请在 JNDI 上下文环境中设置检查周期 jndi.properties,例如:

    java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
    connectionFactory.myConnectionFactory=tcp://localhost:61616?clientFailureCheckPeriod=10000
  • 如果您不使用 JNDI,请通过将值传递给 ActiveMQConnectionFactory.setClientFailureCheckPeriod () 来直接设置检查周期。

    ConnectionFactory cf =  ActiveMQJMSClient.createConnectionFactory(...)
    cf.setClientFailureCheckPeriod(10000);

6.4. 配置生存时间

默认情况下,客户端可以为自己的连接设置生存时(TTL)。以下示例演示了如何设置 TTL。

流程

  • 如果您使用 JNDI 来实例化连接工厂,您可以使用参数 connectionTtl 在 xml 配置中指定它。

    java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
    connectionFactory.myConnectionFactory=tcp://localhost:61616?connectionTtl=30000
  • 如果您不使用 JNDI,则连接 TTL 由 ActiveMQConnectionFactory 实例上的 ConnectionTTL 属性定义。

    ConnectionFactory cf =  ActiveMQJMSClient.createConnectionFactory(...)
    cf.setConnectionTTL(30000);

6.5. 关闭连接

客户端应用程序必须在退出前以受控的方式关闭其资源,以防止发生死连接。在 Java 中,建议在 finally 块中关闭连接:

Connection jmsConnection = null;
try {
   ConnectionFactory jmsConnectionFactory = ActiveMQJMSClient.createConnectionFactoryWithoutHA(...);
   jmsConnection = jmsConnectionFactory.createConnection();
   ...use the connection...
}
finally {
   if (jmsConnection != null) {
      jmsConnection.close();
   }
}

6.6. 配置动态发现

您可以配置 AMQ 核心协议 JMS,以便在尝试建立连接时发现代理列表。

如果您在客户端上使用 JNDI 查找 JMS 连接工厂实例,您可以在 JNDI 上下文环境中指定这些参数。通常,参数在名为 jndi.properties 的文件中定义。连接工厂的 URI 中的主机和部分应与代理 broker.xml 配置文件中的对应 broadcast-group 中的 group-addressgroup-port 匹配。以下是配置为连接到代理的发现组的 jndi.properties 文件示例。

java.naming.factory.initial = ActiveMQInitialContextFactory
connectionFactory.myConnectionFactory=udp://231.7.7.7:9876

当由客户端应用程序从 JNDI 下载此连接工厂并从其创建 JMS 连接时,这些连接将通过侦听代理发现组配置中指定的多播地址来在维护的服务器列表中进行负载平衡。

作为使用 JNDI 的替代选择,您可以在创建 JMS 连接工厂时直接在 Java 代码中指定发现组参数。以下代码提供了如何执行此操作的示例。

final String groupAddress = "231.7.7.7";
final int groupPort = 9876;

DiscoveryGroupConfiguration discoveryGroupConfiguration = new DiscoveryGroupConfiguration();
UDPBroadcastEndpointFactory udpBroadcastEndpointFactory = new UDPBroadcastEndpointFactory();
udpBroadcastEndpointFactory.setGroupAddress(groupAddress).setGroupPort(groupPort);
discoveryGroupConfiguration.setBroadcastEndpointFactory(udpBroadcastEndpointFactory);

ConnectionFactory jmsConnectionFactory = ActiveMQJMSClient.createConnectionFactoryWithHA
    (discoveryGroupConfiguration, JMSFactoryType.CF);

Connection jmsConnection1 = jmsConnectionFactory.createConnection();
Connection jmsConnection2 = jmsConnectionFactory.createConnection();

可以使用 setter 方法 setRefreshTimeout ()DiscoveryGroupConfiguration 上直接设置刷新超时。默认值为 10000 毫秒。

在首次使用时,连接工厂将确保它在创建第一个连接前等待这个时间。默认等待时间为 10000 毫秒,但您可以通过将新值传递给 DiscoveryGroupConfiguration.setDiscoveryInitialWaitTimeout () 来更改它。

6.7. 配置静态发现

有时,您可能无法在您要使用的网络中使用 UDP。在这种情况下,您可以使用可能服务器的初始列表配置连接。列表只能是一个您知道始终可用的代理,或者至少有一个代理列表可用。

这并不意味着您必须知道所有服务器需要托管的位置。您可以将这些服务器配置为使用可靠的服务器进行连接。连接后,其连接详情将从服务器传播到客户端。

如果您在客户端上使用 JNDI 查找 JMS 连接工厂实例,您可以在 JNDI 上下文环境中指定这些参数。通常,参数在名为 jndi.properties 的文件中定义。以下是一个 jndi.properties 文件示例,它提供了一个静态代理列表,而不使用动态发现。

java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
connectionFactory.myConnectionFactory=(tcp://myhost:61616,tcp://myhost2:61616)

当客户端使用上述连接工厂时,其连接将在括号中定义的代理列表中进行负载平衡()。

如果您直接实例化 JMS 连接工厂,您可以在创建 JMS 连接工厂时明确指定连接器列表,如下例所示。

HashMap<String, Object> map = new HashMap<String, Object>();
map.put("host", "myhost");
map.put("port", "61616");
TransportConfiguration broker1 = new TransportConfiguration
    (NettyConnectorFactory.class.getName(), map);

HashMap<String, Object> map2 = new HashMap<String, Object>();
map2.put("host", "myhost2");
map2.put("port", "61617");
TransportConfiguration broker2 = new TransportConfiguration
    (NettyConnectorFactory.class.getName(), map2);

ActiveMQConnectionFactory cf = ActiveMQJMSClient.createConnectionFactoryWithHA
    (JMSFactoryType.CF, broker1, broker2);

6.8. 配置代理连接器

连接器定义客户端如何连接到代理。您可以使用 JMS 连接工厂从客户端配置它们。

Map<String, Object> connectionParams = new HashMap<String, Object>();

connectionParams.put(org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants.PORT_PROP_NAME, 61617);

TransportConfiguration transportConfiguration =
    new TransportConfiguration(
    "org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnectorFactory", connectionParams);

ConnectionFactory connectionFactory = ActiveMQJMSClient.createConnectionFactoryWithoutHA(JMSFactoryType.CF, transportConfiguration);

Connection jmsConnection = connectionFactory.createConnection();

第 7 章 消息发送

7.1. 写入流大消息

要写入大型消息,请使用 BytesMessage.writeBytes () 方法。以下示例从文件中读取字节并将其写入消息:

示例:写入流的大消息

BytesMessage message = session.createBytesMessage();
File inputFile = new File(inputFilePath);
InputStream inputStream = new FileInputStream(inputFile);

int numRead;
byte[] buffer = new byte[1024];

while ((numRead = inputStream.read(buffer, 0, buffer.length)) != -1) {
    message.writeBytes(buffer, 0, numRead);
}

7.2. 从流化大型消息中读取

要从大型消息中读取,请使用 BytesMessage.readBytes () 方法。以下示例从消息读取字节并将其写入文件中:

示例:从流化大消息中读取

BytesMessage message = (BytesMessage) consumer.receive();
File outputFile = new File(outputFilePath);
OutputStream outputStream = new FileOutputStream(outputFile);

int numRead;
byte buffer[] = new byte[1024];

for (int pos = 0; pos < message.getBodyLength(); pos += buffer.length) {
    numRead = message.readBytes(buffer);
    outputStream.write(buffer, 0, numRead);
}

7.3. 使用消息组

消息组是具有以下特征的消息集:

  • 消息组中的消息共享相同的组 ID。也就是说,它们具有相同的组标识符属性。对于 JMS 消息,属性为 JMSXGroupID
  • 消息组中的消息始终由同一消费者消耗,即使队列中有多个使用者也是如此。如果原始消费者关闭,选择另一个消费者接收消息组。

如果您希望同一消费者按顺序处理属性的特定值的所有消息时,消息组很有用。例如,您可能希望将任何特定库存购买的订购由同一消费者按顺序处理。为此,您可以创建用户池,然后将库存名称设置为 message 属性的值。这样可确保特定库存的所有消息始终由同一消费者处理。

设置组 ID

以下示例演示了如何将消息组与 AMQ 核心协议 JMS 搭配使用。

流程

  • 如果您使用 JNDI 为 JMS 客户端建立 JMS 连接工厂,请添加 groupID 参数并提供值。使用这个连接工厂发送的所有消息都将属性 JMSXGroupID 设置为指定的值。

    java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
    connectionFactory.myConnectionFactory=tcp://localhost:61616?groupID=MyGroup
  • 如果您不使用 JNDI,请使用 setStringProperty () 方法设置 JMSXGroupID 属性。

     Message message = new TextMessage();
     message.setStringProperty("JMSXGroupID", "MyGroup");
     producer.send(message);
其他资源

如需了解如何配置和使用消息组的工作示例,请参阅 < install-dir&gt; /examples/features/standard 下的 message-groupmessage-group2

7.4. 使用重复消息检测

AMQ Broker 包括自动重复消息检测,它过滤出它收到的任何重复消息,因此您不必对您自己的重复检测逻辑进行编码。

若要启用重复消息检测,请为消息属性 _AMQ_DUPL_ID 提供唯一的值。代理收到消息时,它会检查 _AMQ_DUPL_ID 是否具有值。如果存在,代理会在其内存缓存中检查,以查看它是否已收到带有该值的消息。如果找到具有相同值的消息,则传入的消息将被忽略。

如果您要在事务中发送消息,则不必为事务中的每个消息设置 _AMQ_DUPL_ID,而是仅在其中之一。如果代理检测到事务中任何消息的重复消息,它会忽略整个事务。

设置重复的 ID 消息属性

以下示例演示了如何使用 AMQ 核心协议 JMS 设置重复的检测属性。请注意,为方便起见,客户端使用常量 org.apache.activemq.artemis.api.core.Message.HDR_DUPLICATE_DETECTION_ID 作为重复 ID 属性 _AMQ_DUPL_ID 的名称。

流程

_AMQ_DUPL_ID 的值设置为唯一的字符串值。

Message jmsMessage = session.createMessage();
String myUniqueID = "This is my unique id";
message.setStringProperty(HDR_DUPLICATE_DETECTION_ID.toString(), myUniqueID);

7.5. 使用消息拦截器

通过 AMQ Core Protocol JMS,您可以截获进入或退出客户端的数据包,允许您审核数据包或过滤消息。拦截器可以更改它们拦截器的数据包。这使得拦截器强大,但也是您应该谨慎使用的功能。

拦截器必须实施 intercept () 方法,它返回一个 布尔值。如果返回的值为 true,则消息数据包将继续。如果返回的值为 false,该过程将中止,则不会调用其他拦截器,并且消息数据包不会被进一步处理。

消息拦截器对主客户端代码透明发生,除了在阻塞发送模式下发送传出数据包时。当启用了阻塞而发送传出数据包并且数据包遇到返回 false 的拦截器时,会抛出 ActiveMQException。thrown 异常包含拦截器的名称。

您的拦截器必须实施 org.apache.artemis.activemq.api.core.Interceptor 接口。客户端拦截器类及其依赖项必须添加到客户端的 Java 类路径中,才能正确实例化和调用。

package com.example;

import org.apache.artemis.activemq.api.core.Interceptor;
import org.apache.activemq.artemis.core.protocol.core.Packet;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;

public class MyInterceptor implements Interceptor {
    private final int ACCEPTABLE_SIZE = 1024;

    @Override
    boolean intercept(Packet packet, RemotingConnection connection) throws ActiveMQException {
        int size = packet.getPacketSize();
        if (size <= ACCEPTABLE_SIZE) {
            System.out.println("This Packet has an acceptable size.");
            return true;
        }
        return false;
    }
}

第 8 章 流控制

流控制可防止生产者和消费者通过限制它们之间的数据流来过度利用。AMQ 核心协议 JMS 允许您为消费者和制作者配置流控制。

消费者流控制

消费者流控制代理和客户端之间的数据流,因为客户端消耗来自代理的消息。在向消费者发送前,AMQ 核心协议 JMS 缓冲区消息。如果没有缓冲区,客户端首先需要在使用代理前从代理请求每个消息。这种类型的"往返"通信非常昂贵。规范客户端中数据流非常重要,因为当消费者无法快速处理消息时,内存不足问题可能会导致缓冲开始溢出,并带有传入消息。

生成者流控制

与基于消费者窗口的流控制类似,客户端可以将从制作者发送的数据量限制为代理,以防止代理被过度使用过多的数据。如果是生成者,窗口大小决定了任意时间点上可以处于 flight 的字节数。

8.1. 设置消费者窗口大小

客户端缓冲区中保存的最大消息大小由窗口大小决定。AMQ 核心协议 JMS 的窗口的默认大小为 1 MiB,或 1024114 1024 字节。对于大多数用例,默认值是正常的。对于其他情况,查找窗口大小的最佳值可能需要基准测试您的系统。如果需要更改默认,AMQ Core Protocol JMS 允许您设置缓冲区窗口大小。

以下示例演示了如何在使用 AMQ Core Protocol JMS 时设置 consumer window size 参数。每个示例将消费者窗口大小设置为 300,000 字节。

流程

  • 如果客户端使用 JNDI 来实例化其连接工厂,请将 consumerWindowSize 参数作为连接字符串 URL 的一部分。将 URL 存储在 JNDI 上下文环境中。以下示例使用 jndi.properties 文件来存储 URL。

    java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
    connectionFactory.myConnectionFactory=tcp://localhost:61616?consumerWindowSize=300000
  • 如果客户端没有使用 JNDI 来实例化其连接工厂,请将值传递给 ActiveMQConnectionFactory.setConsumerWindowSize ()

    ConnectionFactory cf =  ActiveMQJMSClient.createConnectionFactory(...)
    cf.setConsumerWindowSize(300000);

8.2. 设置制作者窗口大小

窗口大小按信信在代理和生成者之间协商,每个字节在窗口中一个信用卡。当消息被发送和使用后,生产者必须请求并被授予来自代理的信信,然后才能发送更多消息。生产者和代理之间的信信交换规定了它们之间的数据流。

以下示例演示了如何在使用 AMQ 核心协议 JMS 时将制作者窗口大小设置为 1024 字节。

流程

  • 如果客户端使用 JNDI 来实例化其连接工厂,请将 producerWindowSize 参数作为连接字符串 URL 的一部分。将 URL 存储在 JNDI 上下文环境中。以下示例使用 jndi.properties 文件来存储 URL。

    java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
    java.naming.provider.url=tcp://localhost:61616?producerWindowSize=1024
  • 如果客户端没有使用 JNDI 来实例化其连接工厂,请将值传递给 ActiveMQConnectionFactory.setProducerWindowSize ()

    ConnectionFactory cf =  ActiveMQJMSClient.createConnectionFactory(...)
    cf.setProducerWindowSize(1024);

8.3. 处理快速消费者

快速消费者可以在信息消耗时更快地处理消息。如果您认为消息传递系统中的消费者非常快,请考虑将窗口大小设置为 -1。将窗口大小设置为此值允许客户端未绑定消息缓冲。但是请谨慎使用此设置。如果消费者无法在收到消息时快速处理消息,客户端的内存可能会溢出。

为快速消费者设置窗口大小

以下示例演示了如何在使用 AMQ Core Protocol JMS 客户端(快速消费者)时将窗口大小设置为 -1。

流程

  • 如果客户端使用 JNDI 来实例化其连接工厂,请将 consumerWindowSize 参数作为连接字符串 URL 的一部分。将 URL 存储在 JNDI 上下文环境中。以下示例使用 jndi.properties 文件来存储 URL。

    java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
    connectionFactory.myConnectionFactory=tcp://localhost:61616?consumerWindowSize=-1
  • 如果客户端没有使用 JNDI 来实例化其连接工厂,请将值传递给 ActiveMQConnectionFactory.setConsumerWindowSize ()

    ConnectionFactory cf =  ActiveMQJMSClient.createConnectionFactory(...)
    cf.setConsumerWindowSize(-1);

8.4. 处理速度较慢的用户

减慢消费者需要大量时间来处理每个消息。在这些情况下,不建议在客户端上缓冲消息。代理中保留消息以供其他用户使用。关闭缓冲区的一个优点是,它在队列的多个消费者之间提供确定性分布。要通过禁用客户端缓冲来处理较慢的用户,请将窗口大小设置为 0。

为较慢的用户设置窗口大小

以下示例演示了如何在使用 AMQ Core Protocol JMS 客户端(消息较慢)时将窗口大小设置为 0。

流程

  • 如果客户端使用 JNDI 来实例化其连接工厂,请将 consumerWindowSize 参数作为连接字符串 URL 的一部分。将 URL 存储在 JNDI 上下文环境中。以下示例使用 jndi.properties 文件来存储 URL。

    java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
    connectionFactory.myConnectionFactory=tcp://localhost:61616?consumerWindowSize=0
  • 如果客户端没有使用 JNDI 来实例化其连接工厂,请将值传递给 ActiveMQConnectionFactory.setConsumerWindowSize ()

    ConnectionFactory cf =  ActiveMQJMSClient.createConnectionFactory(...)
    cf.setConsumerWindowSize(0);
其他资源

如需示例,请参阅 < install-dir&gt; /examples/standard 中的 no-consumer-buffering 示例,其中演示了如何配置代理以防止在处理缓慢消费者时消费者缓冲。

8.5. 设置消息消耗率

您可以规范消费者可以使用消息的速率。也称为 节流,可以规范消耗率,确保消费者不会以比配置允许的速度快地消耗消息。

注意

速率限制流控制可与基于窗口的流控制一起使用。速率限制流控制仅会影响客户端每秒消耗的消息数量,而不是其缓冲区中消息的数量。使用速度较慢的速率限制和基于窗口的高限制时,客户端的内部缓冲会快速填充消息。

速率必须是正整数才能启用此功能,它是以每秒消息单位指定的最大所需消息消耗率。将速率设置为 -1 可禁用速率限制的流控制。默认值为 -1。

以下示例显示了一个客户端,它将消耗消息的速度限制为每秒 10 个消息。

流程

  • 如果客户端使用 JNDI 来实例化其连接工厂,请将 consumerMaxRate 参数作为连接字符串 URL 的一部分。将 URL 存储在 JNDI 上下文环境中。以下示例使用 jndi.properties 文件来存储 URL。

    java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
    java.naming.provider.url=tcp://localhost:61616?consumerMaxRate=10
  • 如果客户端没有使用 JNDI 来实例化其连接工厂,请将值传递给 ActiveMQConnectionFactory.setConsumerMaxRate ()

    ConnectionFactory cf =  ActiveMQJMSClient.createConnectionFactory(...)
    cf.setConsumerMaxRate(10);
其他资源

有关如何限制消费者率的工作示例,请参阅 & lt;install-dir> /examples/standard 中的 consumer-rate-limit 示例。

8.6. 设置消息生产率

AMQ 核心协议 JMS 也可以限制制作者发送消息的速率。生成者率以每秒消息为单位指定。将它设置为 -1 (默认)会禁用速率限制的流控制。

以下示例演示了如何在制作者使用 AMQ Core Protocol JMS 时设置发送消息的速度。每个示例将最大率设置为每秒 10 个消息。

流程

  • 如果客户端使用 JNDI 来实例化其连接工厂,请将 producerMaxRate 参数作为连接字符串 URL 的一部分。将 URL 存储在 JNDI 上下文环境中。以下示例使用 jndi.properties 文件来存储 URL。

    java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
    java.naming.provider.url=tcp://localhost:61616?producerMaxRate=10
  • 如果客户端没有使用 JNDI 来实例化其连接工厂,请将值传递给 ActiveMQConnectionFactory.setProducerMaxRate ()

    ConnectionFactory cf =  ActiveMQJMSClient.createConnectionFactory(...)
    cf.setProducerMaxRate(10);
其他资源

有关如何限制发送消息率的工作示例,请参阅 <install-dir> /examples/standard 中的 producer-rate-limit 示例。

附录 A. 使用您的订阅

AMQ 通过软件订阅提供。要管理您的订阅,请访问红帽客户门户中的帐户。

A.1. 访问您的帐户

流程

  1. 转至 access.redhat.com
  2. 如果您还没有帐户,请创建一个帐户。
  3. 登录到您的帐户。

A.2. 激活订阅

流程

  1. 转至 access.redhat.com
  2. 导航到 My Subscriptions
  3. 导航到 激活订阅 并输入您的 16 位激活号。

A.3. 下载发行文件

要访问 .zip、.tar.gz 和其他发布文件,请使用客户门户查找要下载的相关文件。如果您使用 RPM 软件包或 Red Hat Maven 存储库,则不需要这一步。

流程

  1. 打开浏览器并登录红帽客户门户网站 产品下载页面,网址为 access.redhat.com/downloads
  2. 查找 INTEGRATION 目录中的红帽 AMQ 条目。
  3. 选择所需的 AMQ 产品。此时会打开 Software Downloads 页面。
  4. 单击组件的 Download 链接。

A.4. 为系统注册软件包

要在 Red Hat Enterprise Linux 上安装此产品的 RPM 软件包,必须注册您的系统。如果您使用下载的发行文件,则不需要这一步。

流程

  1. 转至 access.redhat.com
  2. 进入 Registration Assistant
  3. 选择您的操作系统版本,再继续到下一页。
  4. 使用您的系统终端中列出的命令完成注册。

有关注册您的系统的更多信息,请参阅以下资源之一:

附录 B. 使用红帽 Maven 存储库

这部分论述了如何在软件中使用红帽提供的 Maven 存储库。

B.1. 使用在线存储库

红帽维护了一个中央 Maven 存储库,用于您的基于 Maven 的项目。如需更多信息,请参阅 存储库欢迎页面

将 Maven 配置为使用红帽存储库的方法有两种:

在您的 Maven 设置中添加存储库

只要您的 POM 文件没有覆盖存储库配置,且启用了包含的配置集,则此配置方法适用于所有 Maven 项目。

流程

  1. 找到 Maven settings.xml 文件。它通常位于用户主目录的 .m2 目录中。如果文件不存在,请使用文本编辑器来创建该文件。

    对于 Linux 或 UNIX:

    /home/<username>/.m2/settings.xml

    对于 Windows:

    C:\Users\<username>\.m2\settings.xml
  2. settings.xml 文件的 profile 元素中添加包含红帽存储库的新配置集,如下例所示:

    示例:包含红帽存储库的 Maven settings.xml 文件

    <settings>
      <profiles>
        <profile>
          <id>red-hat</id>
          <repositories>
            <repository>
              <id>red-hat-ga</id>
              <url>https://maven.repository.redhat.com/ga</url>
            </repository>
          </repositories>
          <pluginRepositories>
            <pluginRepository>
              <id>red-hat-ga</id>
              <url>https://maven.repository.redhat.com/ga</url>
              <releases>
                <enabled>true</enabled>
              </releases>
              <snapshots>
                <enabled>false</enabled>
              </snapshots>
            </pluginRepository>
          </pluginRepositories>
        </profile>
      </profiles>
      <activeProfiles>
        <activeProfile>red-hat</activeProfile>
      </activeProfiles>
    </settings>

有关 Maven 配置的更多信息,请参阅 Maven 设置参考

将存储库添加到 POM 文件中

要直接在项目中配置存储库,请在 POM 文件的 repositories 元素中添加一个新条目,如下例所示:

示例:包含红帽存储库的 Maven pom.xml 文件

<project>
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>example-app</artifactId>
  <version>1.0.0</version>

  <repositories>
    <repository>
      <id>red-hat-ga</id>
      <url>https://maven.repository.redhat.com/ga</url>
    </repository>
  </repositories>
</project>

有关 POM 文件配置的更多信息,请参阅 Maven POM 参考

B.2. 使用本地存储库

红帽为其某些组件提供基于文件的 Maven 存储库。它们作为可下载存档提供,您可以将其提取到本地文件系统。

要将 Maven 配置为使用本地提取的存储库,请在 Maven 设置或 POM 文件中应用以下 XML:

<repository>
  <id>red-hat-local</id>
  <url>${repository-url}</url>
</repository>

${repository-url} 必须是包含提取存储库的本地文件系统路径的文件 URL。

表 B.1. 本地 Maven 存储库的 URL 示例
操作系统文件系统路径URL

Linux 或 UNIX

/home/alice/maven-repository

file:/home/alice/maven-repository

Windows

C:\repos\red-hat

file:C:\repos\red-hat

附录 C. 使用带有示例的 AMQ Broker

AMQ Core Protocol JMS 示例需要一个正在运行的消息代理,其队列名为 exampleQueue。使用以下步骤安装和启动代理并定义队列。

C.1. 安装代理

按照 AMQ Broker 入门 中的说明 来安装代理 并创建代理实例。启用匿名访问。

以下流程将代理实例的位置称为 < broker-instance-dir>

C.2. 启动代理

流程

  1. 使用 artemis run 命令启动代理。

    $ <broker-instance-dir>/bin/artemis run
  2. 检查控制台输出,以了解启动过程中记录的任何严重错误。现在,代理日志服务器在服务器 就绪时处于活动状态。

    $ example-broker/bin/artemis run
               __  __  ____    ____            _
         /\   |  \/  |/ __ \  |  _ \          | |
        /  \  | \  / | |  | | | |_) |_ __ ___ | | _____ _ __
       / /\ \ | |\/| | |  | | |  _ <| '__/ _ \| |/ / _ \ '__|
      / ____ \| |  | | |__| | | |_) | | | (_) |   <  __/ |
     /_/    \_\_|  |_|\___\_\ |____/|_|  \___/|_|\_\___|_|
    
     Red Hat AMQ <version>
    
    2020-06-03 12:12:11,807 INFO  [org.apache.activemq.artemis.integration.bootstrap] AMQ101000: Starting ActiveMQ Artemis Server
    ...
    2020-06-03 12:12:12,336 INFO  [org.apache.activemq.artemis.core.server] AMQ221007: Server is now live
    ...

C.3. 创建队列

在新终端中,使用 artemis queue 命令创建名为 exampleQueue 的队列。

$ <broker-instance-dir>/bin/artemis queue create --name exampleQueue --address exampleQueue --auto-create-address --anycast

系统将提示您回答一系列是或无问题。对于所有,回答 N

创建队列后,代理就可以与示例程序一起使用。

C.4. 停止代理

运行示例后,请使用 artemis stop 命令来停止代理。

$ <broker-instance-dir>/bin/artemis stop

更新于 2023-09-19

法律通告

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.