使用 AMQ C++ 客户端
使开源包含更多 复制链接链接已复制到粘贴板!
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息。
第 1 章 概述 复制链接链接已复制到粘贴板!
AMQ C++ 是用于开发消息传递应用程序的库。它允许您编写发送和接收 AMQP 消息的 C++ 应用程序。
AMQ C++ 是 AMQ 客户端的一部分,这是支持多种语言和平台的一系列消息传递库。有关客户端的概述,请参阅 AMQ 客户端概述。有关此发行版本的详情,请参考 AMQ Clients 2.11 发行注记。
AMQ C++ 基于 Apache Qpid 中的 Proton API。有关详细的 API 文档,请参阅 AMQ C++ API 参考。
1.1. 主要特性 复制链接链接已复制到粘贴板!
- 简化了与现有应用程序集成的事件驱动的 API
- 用于安全通信的 SSL/TLS
- 灵活的 SASL 身份验证
- 自动重新连接和故障转移
- AMQP 和语言原生数据类型之间的无缝转换
- 访问 AMQP 1.0 的所有特性和功能
1.2. 支持的标准和协议 复制链接链接已复制到粘贴板!
AMQ C++ 支持以下行业认可的标准和网络协议:
- 高级消息队列协议 (AMQP)的版本 1.0
- 传输层安全 (TLS)协议的 1.0、1.1、1.2 和 1.3,是 SSL 的后续版本
- Cyrus SASL 支持的 简单身份验证和安全层 (SASL)机制,包括 ANONYMOUS, PLAIN, SCRAM, EXTERNAL, 和 GSSAPI (Kerberos)
- 使用 IPv6的现代 TCP
1.3. 支持的配置 复制链接链接已复制到粘贴板!
有关 AMQ C++ 支持的配置 的当前信息,请参阅红帽客户门户网站上的 Red Hat AMQ 支持的配置。
1.4. 术语和概念 复制链接链接已复制到粘贴板!
本节介绍核心 API 实体,并描述它们如何一起工作。
| 实体 | 描述 |
|---|---|
| Container | 连接的顶级容器。 |
| 连接 | 网络上两个对等点间的通信的频道。它包含会话。 |
| 会话 | 发送和接收消息的上下文。它包含发送者和接收器。 |
| sender | 将信息发送到目标的频道。它有一个目标。 |
| receiver | 从源接收消息的频道。它有一个源。 |
| 源 | 用于消息的命名源点。 |
| 目标 | 消息的命名目的地。 |
| 消息 | 特定于应用程序的信息片段。 |
| 交付 | 消息传输。 |
AMQ C++ 发送并 接收消息。通过 发送方 和接收器在连接的对等点之间传输消息。发件人和接收器通过会话 建立。会话通过 连接建立。连接在两个唯一标识 的容器 之间建立。虽然连接可以有多个会话,但通常不需要这样做。API 允许您忽略会话,除非您需要它们。
发送对等点会创建发送邮件的发送者。发件人具有在远程对等点上标识队列或主题 的目标。接收对等点会创建一个接收消息的接收器。接收器有一个 源,用于标识远程对等点上的队列或主题。
消息发送称为发送。消息是发送的内容,包括标头和注解等所有元数据。交付是与该内容传输相关联的协议交换。
要指示发送已经完成,发送是发送,可以是发送,也可以是接收方。当另一端了解了它时,它将不再传达该交付。接收器也可以指示它接受或拒绝该消息。
1.5. 文档惯例 复制链接链接已复制到粘贴板!
sudo 命令
在本文档中,sudo 用于任何需要 root 特权的命令。使用 sudo 时请谨慎操作,因为任何更改都可能会影响整个系统。有关 sudo 的更多信息,请参阅使用 sudo 命令。
文件路径
在本文档中,所有文件路径都对 Linux、UNIX 和类似操作系统(例如 /home/andrea)有效。在 Microsoft Windows 上,您必须使用对应的 Windows 路径(例如 C:\Users\andrea)。
变量文本
本文档包含代码块,其中的变量必须替换为特定于您的环境的值。变量文本以箭头括号括起,样式为方便的 monospace。例如,使用以下命令将 < project-dir> 替换为环境的值:
cd <project-dir>
$ cd <project-dir>
第 2 章 安装 复制链接链接已复制到粘贴板!
本章介绍了在您的环境中安装 AMQ C++ 的步骤。
2.1. 先决条件 复制链接链接已复制到粘贴板!
-
要在 Red Hat Enterprise Linux 上使用 AMQ C++ 构建程序,您必须安装
gcc-c++、cmake,并制作软件包。 - 要在 Microsoft Windows 上使用 AMQ C++ 构建程序,您必须安装 Visual Studio。
2.2. 在 Red Hat Enterprise Linux 上安装 复制链接链接已复制到粘贴板!
流程
使用
subscription-manager命令订阅所需的软件包存储库。将<version> 替换为主发行流的2,或将2.11替换用于长期支持发行流。如有必要,将<variant> 替换为您的 Red Hat Enterprise Linux 变体的值(如server或workstation)。Red Hat Enterprise Linux 7
sudo subscription-manager repos --enable=amq-clients-<version>-for-rhel-7-<variant>-rpms
$ sudo subscription-manager repos --enable=amq-clients-<version>-for-rhel-7-<variant>-rpmsCopy to Clipboard Copied! Toggle word wrap Toggle overflow Red Hat Enterprise Linux 8
sudo subscription-manager repos --enable=amq-clients-<version>-for-rhel-8-x86_64-rpms
$ sudo subscription-manager repos --enable=amq-clients-<version>-for-rhel-8-x86_64-rpmsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
yum命令安装qpid-proton-cpp-devel和qpid-proton-cpp-docs软件包。sudo yum install qpid-proton-cpp-devel qpid-proton-cpp-docs
$ sudo yum install qpid-proton-cpp-devel qpid-proton-cpp-docsCopy to Clipboard Copied! Toggle word wrap Toggle overflow
有关使用软件包的详情请参考 附录 B, 使用 Red Hat Enterprise Linux 软件包。
2.3. 在 Microsoft Windows 上安装 复制链接链接已复制到粘贴板!
流程
- 打开浏览器并登录红帽客户门户网站 产品下载页面,网址为 access.redhat.com/downloads。
- 找到 INTEGRATION AND AUTOMATION 类别中的 Red Hat AMQ Clients 条目。
- 点 Red Hat AMQ Clients。此时会打开 Software Downloads 页面。
- 下载 AMQ Clients 2.11.0 C++ .zip 文件。
- 将文件内容提取到您选择的目录中,方法是右键单击 zip 文件并选择 Extract All。
当您提取 .zip 文件的内容时,会创建一个名为 amq-clients-2.11.0-cpp-win 的目录。这是安装的顶级目录,在整个文档中被称为 < install-dir& gt;。
第 3 章 开始使用 复制链接链接已复制到粘贴板!
本章介绍了设置环境并运行简单的消息传递程序的步骤。
3.1. 先决条件 复制链接链接已复制到粘贴板!
3.2. 在 Red Hat Enterprise Linux 上运行 Hello World 复制链接链接已复制到粘贴板!
Hello World 示例创建了一个与代理的连接,发送一条消息,其中包含到 示例 队列的问候消息,然后接收它。成功时,它会将收到的消息输出到控制台。
流程
将示例复制到您选择的位置。
cp -r /usr/share/proton/examples/cpp cpp-examples
$ cp -r /usr/share/proton/examples/cpp cpp-examplesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建构建目录并更改到该目录:
mkdir cpp-examples/bld cd cpp-examples/bld
$ mkdir cpp-examples/bld $ cd cpp-examples/bldCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
cmake配置构建,并使用make编译示例。cmake .. make
$ cmake .. $ makeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行
helloworld程序。./helloworld
$ ./helloworld Hello World!Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 4 章 例子 复制链接链接已复制到粘贴板!
本章演示了通过示例程序使用 AMQ C++。
如需了解更多示例,请参阅 AMQ C++ 示例套件和 Qpid Proton C++ 示例。
本指南中介绍的代码使用 C++11 功能。AMQ C++ 也与 C++03 兼容,但代码需要次要修改。
4.1. 发送消息 复制链接链接已复制到粘贴板!
此客户端程序使用 < connection-url > 连接到服务器,为目标 <address& gt; 创建发件人,发送一条消息,包含 <message-body >、关闭连接并退出。
示例:发送消息
运行示例
要运行示例程序,请将其复制到本地文件,对其进行编译并从命令行执行。如需更多信息,请参阅 第 3 章 开始使用。
g++ send.cpp -o send -std=c++11 -lstdc++ -lqpid-proton-cpp ./send amqp://localhost queue1 hello
$ g++ send.cpp -o send -std=c++11 -lstdc++ -lqpid-proton-cpp
$ ./send amqp://localhost queue1 hello
4.2. 接收信息 复制链接链接已复制到粘贴板!
此客户端程序使用 < connection-url > 连接到服务器,为源 <address& gt; 创建一个接收器,并接收信息直到终止或到达 < count> 信息。
示例:接收信息
运行示例
要运行示例程序,请将其复制到本地文件,对其进行编译并从命令行执行。如需更多信息,请参阅 第 3 章 开始使用。
g++ receive.cpp -o receive -std=c++11 -lstdc++ -lqpid-proton-cpp ./receive amqp://localhost queue1
$ g++ receive.cpp -o receive -std=c++11 -lstdc++ -lqpid-proton-cpp
$ ./receive amqp://localhost queue1
第 5 章 使用 API 复制链接链接已复制到粘贴板!
如需更多信息,请参阅 AMQ C++ API 参考 和 AMQ C++ 示例套件。
5.1. 处理消息传递事件 复制链接链接已复制到粘贴板!
AMQ C++ 是一个异步事件驱动的 API。为了定义应用如何处理事件,用户在 messaging_handler 类上实施回调方法。然后,这些方法被称为网络活动或计时器触发新事件。
示例:处理消息传递事件
这些只是几个常见情况事件。完整集合记录在 API 参考 中。
5.2. 创建容器 复制链接链接已复制到粘贴板!
容器是顶级 API 对象。它是创建连接的入口点,它负责运行主事件循环。它通常由全局事件处理程序构建。
示例:创建容器
int main() {
example_handler handler {};
proton::container cont {handler};
cont.run();
}
int main() {
example_handler handler {};
proton::container cont {handler};
cont.run();
}
5.3. 设置容器身份 复制链接链接已复制到粘贴板!
每个容器实例具有唯一的身份,称为容器 ID。当 AMQ C++ 进行连接时,它会将容器 ID 发送到远程对等点。要设置容器 ID,请将其传递给 proton::container 构造器。
示例:设置容器身份
proton::container cont {handler, "job-processor-3"};
proton::container cont {handler, "job-processor-3"};
如果用户未设置 ID,则当容器被决定时,库会生成一个 UUID。
第 6 章 网络连接 复制链接链接已复制到粘贴板!
6.1. 连接 URL 复制链接链接已复制到粘贴板!
连接 URL 对用于建立新连接的信息进行编码。
连接 URL 语法
scheme://host[:port]
scheme://host[:port]
-
scheme - 连接传输,用于未加密的 TCP
的或使用 SSL/TLS 加密的 TCP 的 amqp。amqp - Host - 远程网络主机。该值可以是主机名或数字 IP 地址。IPv6 地址必须包括在方括号中。
-
port - 远程网络端口。这个值是可选的。对于
amqp方案,默认值是 5672,amqps方案的 5671。
连接 URL 示例
amqps://example.com amqps://example.net:56720 amqp://127.0.0.1 amqp://[::1]:2000
amqps://example.com
amqps://example.net:56720
amqp://127.0.0.1
amqp://[::1]:2000
6.2. 创建出站连接 复制链接链接已复制到粘贴板!
要连接到远程服务器,请使用 连接 URL 调用 container::connect () 方法。这通常在 messaging_handler::on_container_start () 方法内完成。
示例:创建传出连接
有关创建安全连接的详情,请参考 第 7 章 安全性。
6.3. 配置重新连接 复制链接链接已复制到粘贴板!
重新连接可让客户端从丢失的连接中恢复。它用于确保分布式系统中的组件在临时网络或组件故障后重新建立通信。
AMQ C++ 默认禁用重新连接。要启用它,请将 reconnect connection 选项设置为 reconnect_options 类的实例。
示例:启用重新连接
启用重新连接后,如果连接丢失或连接尝试失败,客户端会在短暂的延迟后重试。每次新尝试都会增加延迟。
要控制连接尝试之间的延迟,请设置 delay、 和 delay _multipliermax_delay 选项。所有持续时间都以毫秒为单位指定。
要限制重新连接尝试次数,请设置 max_attempts 选项。将它设置为 0 可移除任何限制。
示例:配置重新连接
6.4. 配置故障转移 复制链接链接已复制到粘贴板!
AMQ C++ 允许您配置多个连接端点。如果连接到一个失败,客户端会尝试连接到列表中的下一个。如果列表耗尽,该过程会启动。
要指定备用连接端点,请将 failover_urls reconnect 选项设置为连接 URL 列表。
示例:配置故障切换
6.5. 接受进入的连接 复制链接链接已复制到粘贴板!
AMQ C++ 可以接受入站网络连接,使您能够构建自定义消息传递服务器。
要开始侦听连接,请使用 proton::container::listen () 方法,以及包含要侦听的本地主机地址和端口的 URL。
示例:接受传入的连接
特殊的 IP 地址 0.0.0.0 侦听所有可用的 IPv4 接口。要侦听所有 IPv6 接口,请使用 [::0]。
如需更多信息,请参阅 服务器 receive.cpp 示例。
第 7 章 安全性 复制链接链接已复制到粘贴板!
7.1. 使用 SSL/TLS 保护连接 复制链接链接已复制到粘贴板!
AMQ C++ 使用 SSL/TLS 来加密客户端和服务器之间的通信。
要使用 SSL/TLS 连接到远程服务器,请设置 ssl_client_options 连接选项,并使用带有 amqps 方案的连接 URL。ssl_client_options 构造器使用 CA 证书的文件名、目录或数据库 ID。
示例:启用 SSL/TLS
7.2. 使用用户和密码连接 复制链接链接已复制到粘贴板!
AMQ C++ 可以使用用户和密码验证连接。
要指定用于身份验证的凭证,请在 connect 方法上设置 选项。
用户和密码
示例:使用用户和密码连接
7.3. 配置 SASL 身份验证 复制链接链接已复制到粘贴板!
AMQ C++ 使用 SASL 协议来执行身份验证。SASL 可以使用多种不同的 验证机制。当两个网络对等连接时,它们交换其允许的机制,并选择了这两者允许的最强机制。
客户端使用 Cyrus SASL 执行身份验证。Cyrus SASL 使用插件来支持特定的 SASL 机制。在使用特定的 SASL 机制前,必须安装相关的插件。例如,您需要 cyrus-sasl-plain 插件才能使用 SASL PLAIN 身份验证。
要查看 Red Hat Enterprise Linux 中的 Cyrus SASL 插件列表,请使用 yum search cyrus-sasl 命令。要安装 Cyrus SASL 插件,请使用 yum install PLUG-IN 命令。
默认情况下,AMQ C++ 允许本地 SASL 库配置支持的所有机制。要限制允许的机制,从而控制可以协商哪些机制,请使用 sasl_allowed_mechs 连接选项。这个选项接受包含空格分隔的机制名称列表的字符串。
示例:配置 SASL 身份验证
proton::connection_options opts {};
opts.sasl_allowed_mechs("ANONYMOUS");
container.connect("amqps://example.com", opts);
proton::connection_options opts {};
opts.sasl_allowed_mechs("ANONYMOUS");
container.connect("amqps://example.com", opts);
这个示例强制连接使用 ANONYMOUS 机制进行身份验证,即使我们连接的服务器可以提供其他选项。有效机制包括 ANONYMOUS,PLAIN,SCRAM-SHA-256,SCRAM-SHA-1,GSSAPI, 和 EXTERNAL。
AMQ C++ 默认启用 SASL。要禁用它,将 sasl_enabled 连接选项设置为 false。
示例:禁用 SASL
proton::connection_options opts {};
opts.sasl_enabled(false);
container.connect("amqps://example.com", opts);
proton::connection_options opts {};
opts.sasl_enabled(false);
container.connect("amqps://example.com", opts);
7.4. 使用 Kerberos 进行身份验证 复制链接链接已复制到粘贴板!
Kerberos 是一种网络协议,用于根据加密票据的交换集中管理身份验证。如需更多信息,请参阅使用 Kerberos。
- 在您的操作系统中配置 Kerberos。请参阅 配置 Kerberos 在 Red Hat Enterprise Linux 中设置 Kerberos。
在客户端应用程序中启用
GSSAPISASL 机制。proton::connection_options opts {}; opts.sasl_allowed_mechs("GSSAPI"); container.connect("amqps://example.com", opts);proton::connection_options opts {}; opts.sasl_allowed_mechs("GSSAPI"); container.connect("amqps://example.com", opts);Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
kinit命令验证您的用户凭证并存储生成的 Kerberos 票据。kinit USER@REALM
$ kinit USER@REALMCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 运行客户端程序。
第 8 章 发件人和接收器 复制链接链接已复制到粘贴板!
客户端使用发送方和接收器链接来代表传递消息的频道。发件人和接收器是单向的,消息来源的源结尾和消息目的地的目标结尾。
源和目标通常指向消息代理上的队列或主题。源也用于代表订阅。
8.1. 根据需要创建队列和主题 复制链接链接已复制到粘贴板!
有些消息服务器支持按需创建队列和主题。附加发送方或接收器时,服务器使用发送者目标地址或接收器源地址来创建名称与地址匹配的队列或主题。
邮件服务器通常默认为创建队列(用于一对一消息发送)或主题(用于一对多消息发送)。客户端可以通过在源或目标上设置 功能来指示首选情况。
队列或主题
要选择队列或主题语义,请按照以下步骤执行:
- 配置您的消息服务器,以自动创建队列和主题。这通常是默认配置。
-
在发送者目标或接收器源上设置
队列或主题功能,如下例所示。
示例:发送到按需创建的队列
示例:从按需创建的主题接收
如需了解更多详细信息,请参阅以下示例:
8.2. 创建持久订阅 复制链接链接已复制到粘贴板!
持久化订阅是远程服务器上的一个状态,代表一个消息接收器。通常,当客户端关闭时,消息接收方会被丢弃。但是,由于持久订阅是持久的,客户端可以从它们分离,之后再重新连接。当客户端重新附加时,任何在分离时收到的消息都可用。
持久化订阅通过组合客户端容器 ID 和接收器名称来组成订阅 ID 来唯一标识。它们必须具有稳定的值,以便可以恢复订阅。
要创建持久订阅,请按照以下步骤执行:
将连接容器 ID 设置为 stable 值,如
client-1:proton::container cont {handler, "client-1"};proton::container cont {handler, "client-1"};Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用稳定名称(如
sub-1)创建一个接收器,并通过设置 persistence_mode 和配置接收器源:expiry_policy选项来为持久性Copy to Clipboard Copied! Toggle word wrap Toggle overflow
要从订阅分离,请使用 proton::receiver::detach () 方法。要终止订阅,请使用 proton::receiver::close () 方法。
如需更多信息,请参阅 durable-subscribe.cpp 示例。
第 9 章 消息交付 复制链接链接已复制到粘贴板!
9.1. 发送消息 复制链接链接已复制到粘贴板!
若要发送消息,可覆盖 on_sendable 事件处理程序,并调用 sender::send () 方法。当 proton::sender 有足够信的信用来发送至少一条消息时,可 发送的事件将触发。
示例:发送消息
9.2. 跟踪发送的消息 复制链接链接已复制到粘贴板!
发送消息后,发件人可以保留对代表传输的 tracker 对象的引用。接收器接受或拒绝发送的每个消息。发件人会通知每个跟踪发送的结果。
要监控发送的消息的结果,请覆盖 on_tracker_accept 和 on_tracker_reject 事件处理程序,并将交付状态更新映射到从 send () 返回的 tracker。
示例:跟踪发送的消息
tracker 对象具有一个 tag () 方法,用于访问每个发送的唯一标识符。delivery 标签可用于存储在连接失败后重新发送的消息。
9.3. 接收信息 复制链接链接已复制到粘贴板!
要接收消息,请创建一个接收器并覆盖 on_message 事件处理程序。
示例:接收信息
delivery 对象具有一个 tag () 方法,用于访问每个发送的唯一标识符。
9.4. 确认收到的消息 复制链接链接已复制到粘贴板!
要显式接受或拒绝发送,请使用 on_message 事件处理程序中的 delivery::accept () 或 delivery::reject () 方法。
示例:确认收到的信息
默认情况下,如果您没有明确确认发送,则库会在 on_message 返回后接受它。要禁用此行为,将 auto_accept receiver 选项设置为 false。
第 10 章 错误处理 复制链接链接已复制到粘贴板!
AMQ C++ 中的错误可以通过两种不同的方式处理:
- 捕获例外
- 覆盖事件处理功能以截获 AMQP 协议或连接错误
捕获例外是最基本但最精细的方法来处理错误。如果没有在处理程序函数中使用覆盖处理错误,则会抛出异常。
10.1. 捕获例外 复制链接链接已复制到粘贴板!
如果没有在事件处理函数中使用覆盖处理错误,则 容器运行 方法会抛出异常。
AMQ C++ 丢弃从 proton::error 类继承的所有例外,后者又从 std::runtime_error 和 std::exception 类继承。
以下示例演示了如何捕获 AMQ C++ 中抛出的异常:
示例:特定于 API 的异常处理
如果您不需要特定于 API 的异常处理,您只需要捕获 std::exception,因为 proton::error 会继承它。
10.2. 处理连接和协议错误 复制链接链接已复制到粘贴板!
您可以通过覆盖以下 messaging_handler 方法来处理协议级错误:
-
on_transport_error(proton::transport&) -
on_connection_error(proton::connection&) -
on_session_error(proton::session&) -
on_receiver_error(proton::receiver&) -
on_sender_error(proton::sender&)
每当事件发生特定对象时,这些事件处理例程都会调用。在调用错误处理程序后,也会调用相应的关闭处理程序。
如果没有覆盖多个更具体的错误处理程序,则调用默认错误处理程序:
-
on_error(proton::error_condition&)
由于在出现任何错误时调用关闭处理程序,因此仅需要在错误处理程序中处理错误本身。资源清理可以通过关闭的处理程序来管理。如果没有特定于特定对象的错误处理,则通常使用常规 on_error 处理程序,且没有更具体的处理程序。
当启用重新连接并且远程服务器关闭具有 amqp:connection:forced 条件的连接时,客户端不会将其视为错误,因此不会触发 on_connection_error 处理程序。相反,客户端会开始重新连接过程。
第 11 章 日志记录 复制链接链接已复制到粘贴板!
11.1. 启用协议日志记录 复制链接链接已复制到粘贴板!
客户端可以将 AMQP 协议帧记录到控制台。诊断问题时,这些数据通常至关重要。
要启用协议日志记录,请将 PN_TRACE_FRM 环境变量设置为 1:
示例:启用协议日志记录
export PN_TRACE_FRM=1 <your-client-program>
$ export PN_TRACE_FRM=1
$ <your-client-program>
要禁用协议日志记录,请取消设置 PN_TRACE_FRM 环境变量。
第 12 章 线程和调度 复制链接链接已复制到粘贴板!
AMQ C++ 支持使用 C++11 及之后的版本的完整多线程。旧版本 C++ 可能会有有限的多线程。请参阅 第 12.6 节 “使用旧版本的 C++”。
12.1. 线程模型 复制链接链接已复制到粘贴板!
容器 对象可以同时处理多个连接。当 AMQP 事件在连接上发生时,容器会调用 messaging_handler 回调函数。任何一个连接的回调都会按顺序化(不同时调用),但不同连接的回调可以安全地并行执行。
您可以使用 handler connection 选项,将处理程序分配给 container::connect () 或 listen_handler::on_accept () 中的连接。建议为每个连接创建一个单独的处理程序,以便处理程序不需要锁定或其他同步来保护它不受库线程的并发使用。如果有任何非library 线程同时使用处理程序,则需要同步。
12.2. thread-safety 规则 复制链接链接已复制到粘贴板!
连接、会话、发送者、接收器、跟踪器 和交付 对象不是线程安全状态,受以下规则约束:
-
您必须只使用它们来自
messaging_handler回调或work_queue函数。 - 对于另一个连接,不要使用属于来自回调的一个连接的对象。
- 您可以在成员变量中存储 AMQ C++ 对象,以便在后续回调中使用,只要您遵守规则 2。
message 对象是一个值类型,其线程限制与标准 C++ 内置类型相同。它不能同时修改。
12.3. 工作队列 复制链接链接已复制到粘贴板!
work_queue 接口提供了一种安全的方法,可在不同的连接处理程序之间或非library 线程和连接处理程序之间进行通信。
-
每个连接都有一个关联的
work_queue。 - 工作队列是 thread-safe (C++11 或更高版本)。任何线程都可以添加工作。
-
work项是一个std::function,绑定参数则称为事件回调。
当库调用工作函数时,它被安全序列化,以便您可以像事件回调一样对待工作功能,并安全地访问其中存储的处理器和 AMQ C++ 对象。
12.4. wake primitive 复制链接链接已复制到粘贴板!
connection::wake () 方法通过触发 on_connection_wake () 回调,允许任何线程在连接上提示活动。这是 连接 上唯一的 thread-safe 方法。
wake () 是一个轻量级、低级别的原语,用于在线程之间进行信号。
-
它不执行任何代码或数据,这与
work_queue不同。 -
对
wake ()的多个调用可能会合并到一个on_connection_wake ()中。 -
可能会出现对
on_connection_wake ()的调用,而无需任何应用程序调用wake (),因为库在内部使用wake ()。
wake () 的语义与 std::condition_variable::notify_one () 类似。会有一个唤醒,但必须有一些共享应用程序状态来确定发生唤醒的原因,以及要对其执行什么操作。
工作队列在很多实例中更易于使用,但是如果您已经拥有自己的外部线程安全队列,并且需要高效的方法来唤醒连接来检查它们的数据,则 wake () 可能很有用。
12.5. 调度延迟工作 复制链接链接已复制到粘贴板!
AMQ C++ 能够延迟后执行代码。您可以使用它来实现应用程序中的基于时间的行为,如定期调度的工作或超时。
要延迟固定时间的工作,请使用 schedule 方法设置延迟并注册定义工作的功能。
示例:在延迟后发送消息
本例在发件人的工作队列中使用 schedule 方法,以将其建立为工作的执行上下文。
12.6. 使用旧版本的 C++ 复制链接链接已复制到粘贴板!
在 C++11 之前,在 C++ 中不支持线程。您可以将 AMQ C++ 与线程一起使用,但有以下限制。
-
容器不创建线程。它仅使用调用
container::run ()的单个线程。 -
AMQ C++ 库类都不是 thread-safe,包括
container和work_queue。您需要一个外部锁定才能在多个线程中使用容器。唯一的例外是connection::wake ()。即使在较旧的 C++ 中,它是线程安全。
container::schedule () 和 work_queue API 接受 C++11 lambda 函数来定义工作单元。如果您使用不支持 lambda 的 C++ 版本,则必须使用 make_work () 函数。
第 13 章 基于文件的配置 复制链接链接已复制到粘贴板!
AMQ C++ 可以读取用于从名为 connect.json 的本地文件中建立连接的配置选项。这可让您在部署时在应用程序中配置连接。
当应用调用容器连接方法时,库会尝试读取文件,而无需提供任何连接选项。
13.1. 文件位置 复制链接链接已复制到粘贴板!
如果设置,AMQ C++ 将使用 MESSAGING_CONNECT_FILE 环境变量的值来定位配置文件。
如果没有设置 MESSAGING_CONNECT_FILE,AMQ C++ 会在以下位置搜索名为 connect.json 的文件,并按照所示的顺序搜索。它在第一次遇到的匹配项时停止。
对于 Linux:
-
$PWD/connect.json,其中$PWD是客户端进程的当前工作目录 -
$HOME/.config/messaging/connect.json,其中$HOME是当前用户主目录 -
/etc/messaging/connect.json
在 Windows 上:
-
%CD%/connect.json,其中%cd%是客户端进程的当前工作目录
如果没有找到 connect.json 文件,则库为所有选项使用默认值。
13.2. 文件格式 复制链接链接已复制到粘贴板!
connect.json 文件包含 JSON 数据,具有对 JavaScript 注释的额外支持。
所有配置属性都是可选的,或者具有默认值,因此一个简单的示例只需要提供几个详情:
示例:一个简单的 connect.json 文件
{
"host": "example.com",
"user": "alice",
"password": "secret"
}
{
"host": "example.com",
"user": "alice",
"password": "secret"
}
SASL 和 SSL/TLS 选项嵌套在 "sasl" 和 "tls" 命名空间下:
示例:带有 SASL 和 SSL/TLS 选项的 connect.json 文件
13.3. 配置选项 复制链接链接已复制到粘贴板!
选项键包含一个点(.),代表嵌套在命名空间内的属性。
| 键 | 值类型 | 默认值 | 描述 |
|---|---|---|---|
|
| string |
|
|
|
| string |
| 远程主机的主机名或 IP 地址 |
|
| 字符串或数字 |
| 端口号或端口字面 |
|
| string | 无 | 进行身份验证的用户名 |
|
| string | 无 | 进行身份验证的密码 |
|
| list 或 string | none (系统默认设置) | 启用 SASL 机制的 JSON 列表。裸机字符串代表一种机制。如果未指定,客户端将使用系统提供的默认机制。 |
|
| 布尔值 |
| 启用发送明文密码的机制 |
|
| string | 无 | 客户端证书的文件名或数据库 ID |
|
| string | 无 | 客户端证书的私钥的文件名或数据库 ID |
|
| string | 无 | CA 证书的文件名、目录或数据库 ID |
|
| 布尔值 |
| 需要具有匹配主机名的有效服务器证书 |
第 14 章 互操作性 复制链接链接已复制到粘贴板!
本章讨论了如何将 AMQ C++ 与其他 AMQ 组件结合使用。有关 AMQ 组件的兼容性概述,请参阅 产品简介。
14.1. 与其他 AMQP 客户端交互 复制链接链接已复制到粘贴板!
AMQP 消息使用 AMQP 类型系统 组成。这种通用格式是以不同语言的 AMQP 客户端能够相互互操作的原因之一。
发送消息时,AMQ C++ 会自动将语言原生类型转换为 AMQP 编码数据。收到信息时,反向转换就发生。
有关 AMQP 类型的更多信息,请访问由 Apache Qpid 项目维护 的交互式类型参考。
| AMQP 类型 | 描述 |
|---|---|
| 一个空值 | |
| true 或 false 值 | |
| 单个 Unicode 字符 | |
| 一系列 Unicode 字符 | |
| 一个字节序列 | |
| 签名的 8 位整数 | |
| 签名的 16 位整数 | |
| 签名的 32 位整数 | |
| 签名的 64 位整数 | |
| 未签名的 8 位整数 | |
| 未签名的 16 位整数 | |
| 未签名的 32 位整数 | |
| 未签名的 64 位整数 | |
| 32 位浮点号 | |
| 64 位浮点号 | |
| 单个类型的值的序列 | |
| 变量类型的序列值 | |
| 从不同键到值的映射 | |
| 通用唯一标识符 | |
| 来自受限域的 7 位 ASCII 字符串 | |
| 一个绝对时间点 |
| AMQP 类型 | 编码前的 AMQ C++ 类型 | 解码后 AMQ C++ 类型 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 编码前的 AMQ C++ 类型 | AMQ JavaScript 类型 | AMQ .NET 类型 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 编码前的 AMQ C++ 类型 | AMQ Python 类型 | AMQ Ruby 类型 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| - | - |
|
|
|
|
|
|
|
|
14.2. 使用 AMQ JMS 进行交互 复制链接链接已复制到粘贴板!
AMQP 定义标准映射到 JMS 消息传递模型。本节讨论该映射的各个方面。如需更多信息,请参阅 AMQ JMS Interoperability 章节。
JMS 消息类型
AMQ C++ 提供单个消息类型,其正文类型可能会有所不同。相反,JMS API 使用不同的消息类型来代表不同类型的数据。下表标明特定的正文类型如何映射到 JMS 消息类型。
若要更明确地控制生成的 JMS 消息类型,您可以设置 x-opt-jms-msg-type 消息注释。如需更多信息,请参阅 AMQ JMS Interoperability 章节。
| AMQ C++ 正文类型 | JMS 消息类型 |
|---|---|
|
| |
|
| |
|
| |
| 任何其他类型 |
14.3. 连接到 AMQ Broker 复制链接链接已复制到粘贴板!
AMQ Broker 旨在与 AMQP 1.0 客户端互操作。检查以下内容以确保为 AMQP 消息传递配置了代理:
- 网络防火墙中的端口 5672 将打开。
- 启用 AMQ Broker AMQP acceptor。请参阅 默认接受者设置。
- 在代理上配置必要的地址。请参阅 地址、队列和主题。
- 代理配置为允许来自您的客户端的访问,客户端被配置为发送所需的凭证。请参阅 Broker 安全。
附录 A. 使用您的订阅 复制链接链接已复制到粘贴板!
AMQ 通过软件订阅提供。要管理您的订阅,请访问红帽客户门户中的帐户。
A.1. 访问您的帐户 复制链接链接已复制到粘贴板!
流程
- 转至 access.redhat.com。
- 如果您还没有帐户,请创建一个帐户。
- 登录到您的帐户。
A.2. 激活订阅 复制链接链接已复制到粘贴板!
流程
- 转至 access.redhat.com。
- 导航到 My Subscriptions。
- 导航到 激活订阅 并输入您的 16 位激活号。
A.3. 下载发行文件 复制链接链接已复制到粘贴板!
要访问 .zip、.tar.gz 和其他发布文件,请使用客户门户查找要下载的相关文件。如果您使用 RPM 软件包或 Red Hat Maven 存储库,则不需要这一步。
流程
- 打开浏览器并登录红帽客户门户网站 产品下载页面,网址为 access.redhat.com/downloads。
- 查找 INTEGRATION 目录中的红帽 AMQ 条目。
- 选择所需的 AMQ 产品。此时会打开 Software Downloads 页面。
- 单击组件的 Download 链接。
A.4. 为系统注册软件包 复制链接链接已复制到粘贴板!
要在 Red Hat Enterprise Linux 上安装此产品的 RPM 软件包,必须注册您的系统。如果您使用下载的发行文件,则不需要这一步。
流程
- 转至 access.redhat.com。
- 进入 Registration Assistant。
- 选择您的操作系统版本,再继续到下一页。
- 使用您的系统终端中列出的命令完成注册。
有关注册您的系统的更多信息,请参阅以下资源之一:
附录 B. 使用 Red Hat Enterprise Linux 软件包 复制链接链接已复制到粘贴板!
这部分论述了如何使用作为 Red Hat Enterprise Linux 的 RPM 软件包提供的软件。
要确保此产品的 RPM 软件包可用,您必须首先 注册您的系统。
B.1. 概述 复制链接链接已复制到粘贴板!
库或服务器等组件通常关联有多个软件包。您不必安装它们。您只能安装您需要的用户。
主软件包通常具有最简单的名称,而不带有其他限定符。这个软件包提供了在程序运行时使用组件所需的所有接口。
名称以 -devel 结尾的软件包包含 C 和 C++ 库的标头。在编译时,需要它们来构建依赖于此软件包的程序。
名称以 -docs 结尾的软件包包含组件的文档和示例程序。
有关使用 RPM 软件包的更多信息,请参阅以下资源之一:
B.2. 搜索软件包 复制链接链接已复制到粘贴板!
要搜索软件包,请使用 yum search 命令。搜索结果包括软件包名称,您可以在本节中列出的其他命令中用作 & lt;package > 的值。
yum search <keyword>...
$ yum search <keyword>...
B.3. 安装软件包 复制链接链接已复制到粘贴板!
要安装软件包,请使用 yum install 命令。
sudo yum install <package>...
$ sudo yum install <package>...
B.4. 查询软件包信息 复制链接链接已复制到粘贴板!
要列出系统中安装的软件包,请使用 rpm -qa 命令。
rpm -qa
$ rpm -qa
要获取有关特定软件包的信息,请使用 rpm -qi 命令。
rpm -qi <package>
$ rpm -qi <package>
要列出与软件包关联的所有文件,请使用 rpm -ql 命令。
rpm -ql <package>
$ rpm -ql <package>
附录 C. 使用带有示例的 AMQ Broker 复制链接链接已复制到粘贴板!
AMQ C++ 示例需要一个正在运行的消息代理,其中包含名为 example 的队列。使用以下步骤安装和启动代理并定义队列。
C.1. 安装代理 复制链接链接已复制到粘贴板!
按照 AMQ Broker 入门 中的说明 来安装代理 并创建代理实例。启用匿名访问。
以下流程将代理实例的位置称为 < broker-instance-dir>。
C.2. 启动代理 复制链接链接已复制到粘贴板!
流程
使用
artemis run命令启动代理。<broker-instance-dir>/bin/artemis run
$ <broker-instance-dir>/bin/artemis runCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检查控制台输出,以查看启动期间记录的所有关键错误。代理日志服务器
现在在服务器就绪时处于实时状态。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
C.3. 创建队列 复制链接链接已复制到粘贴板!
在新终端中,使用 artemis queue 命令创建名为 example 的队列。
<broker-instance-dir>/bin/artemis queue create --name examples --address examples --auto-create-address --anycast
$ <broker-instance-dir>/bin/artemis queue create --name examples --address examples --auto-create-address --anycast
系统将提示您回答一系列 yes 或没有问题。全部答案为 N。
创建队列后,代理就可以与示例程序一起使用。
C.4. 停止代理 复制链接链接已复制到粘贴板!
运行完示例后,请使用 artemis stop 命令来停止代理。
<broker-instance-dir>/bin/artemis stop
$ <broker-instance-dir>/bin/artemis stop
更新于 2023-09-26