使用 AMQ .NET 客户端


Red Hat AMQ Clients 2.11

用于 AMQ Clients 2.11

摘要

本指南论述了如何安装和配置客户端,运行实践示例,并将您的客户端与其他 AMQ 组件一起使用。

使开源包含更多

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

第 1 章 概述

AMQ .NET 是 .NET 平台的轻量级 AMQP 1.0 库。它可让您编写用于发送和接收 AMQP 消息的 .NET 应用程序。

AMQ .NET 是 AMQ 客户端的一部分,这是支持多种语言和平台的一系列消息传递库。有关客户端的概述,请参阅 AMQ 客户端概述。有关此发行版本的详情,请参考 AMQ Clients 2.11 发行注记

AMQ .NET 基于 AMQP.Net Lite。有关详细的 API 文档,请参阅 AMQ .NET API 参考

1.1. 主要特性

  • 用于安全通信的 SSL/TLS
  • 灵活的 SASL 身份验证
  • AMQP 和原生数据类型之间的无缝转换
  • 访问 AMQP 1.0 的所有特性和功能
  • 具有完整 IntelliSense API 文档的集成开发环境

1.2. 支持的标准和协议

AMQ .NET 支持以下行业认可的标准和网络协议:

1.3. 支持的配置

有关 AMQ .NET 支持的配置 的当前信息,请参阅红帽客户门户网站上的 Red Hat AMQ 支持的配置。

1.4. 术语和概念

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

Expand
表 1.1. API 术语
实体描述

连接

网络上两个对等点间的通信的频道

会话

发送和接收消息的上下文

发件人链接

将信息发送到目标的频道

接收器链接

从源接收消息的频道

用于消息的命名源点

目标

消息的命名目的地

消息

应用程序数据的可变持有者

AMQ .NET 发送并接收信息。通过 链接 在连接的对等点之间传输消息。通过会话建立 链接。会话通过 连接建立

发送对等点会创建 发送邮件的发送者链接。发件人链接具有一个 目标,用于标识远程对等点上的队列或主题。接收客户端会创建一个 接收器链接 来接收信息。接收器链接有一个 ,用于标识远程对等点上的队列或主题。

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>
Copy to Clipboard Toggle word wrap

第 2 章 安装

本章介绍了在您的环境中安装 AMQ .NET 的步骤。

2.1. 先决条件

  • 您必须具有访问 AMQ 发行文件和软件仓库 的订阅
  • 要在 Red Hat Enterprise Linux 上使用 AMQ .NET,您必须安装 .NET Core 3.1 开发人员工具。如需更多信息,请参阅 .NET Core 3.1 入门指南
  • 要在 Microsoft Windows 上使用 AMQ .NET 构建程序,您必须安装 Visual Studio。

2.2. 在 Red Hat Enterprise Linux 上安装

流程

  1. 打开浏览器并登录红帽客户门户网站 产品下载页面,网址为 access.redhat.com/downloads
  2. 找到 INTEGRATION AND AUTOMATION 类别中的 Red Hat AMQ Clients 条目。
  3. Red Hat AMQ Clients。此时会打开 Software Downloads 页面。
  4. 下载 AMQ Clients 2.11.0 .NET Core .zip 文件。
  5. 使用 unzip 命令将文件内容提取到您选择的目录中。

    $ unzip amq-clients-2.11.0-dotnet-core.zip
    Copy to Clipboard Toggle word wrap

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

  6. 使用文本编辑器创建文件 $HOME/.nuget/NuGet/NuGet.Config,并添加以下内容:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <packageSources>
        <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3"/>
        <add key="amq-clients" value="<install-dir>/nupkg"/>
      </packageSources>
    </configuration>
    Copy to Clipboard Toggle word wrap

    如果您已有一个 NuGet.Config 文件,请将 amq-clients 行添加到其中。

    或者,您可以将 < install-dir>/nupkg 目录中的 .nupkg 文件移到现有的软件包源位置。

2.3. 在 Microsoft Windows 上安装

流程

  1. 打开浏览器并登录红帽客户门户网站 产品下载页面,网址为 access.redhat.com/downloads
  2. 找到 INTEGRATION AND AUTOMATION 类别中的 Red Hat AMQ Clients 条目。
  3. Red Hat AMQ Clients。此时会打开 Software Downloads 页面。
  4. 下载 AMQ Clients 2.11.0 .NET .zip 文件。
  5. 将文件内容提取到您选择的目录中,方法是右键单击 zip 文件并选择 Extract All

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

第 3 章 开始使用

本章介绍了设置环境并运行简单的消息传递程序的步骤。

3.1. 先决条件

  • 您必须为您的环境 完成安装过程
  • 您必须有一个 AMQP 1.0 消息代理侦听接口 localhost 和端口 5672 上的连接。它必须启用匿名访问权限。如需更多信息,请参阅 启动代理
  • 您必须有一个名为 amq.topic 的队列。如需更多信息,请参阅创建队列

3.2. 在 Red Hat Enterprise Linux 上运行 HelloWorld

Hello World 示例创建了一个与代理的连接,发送一条消息,其中包含到 amq.topic 队列的问候队列,然后接收它。成功时,它会将收到的消息输出到控制台。

进入 &lt ;install-dir> /examples/netcoreapp3/HelloWorld-simple,并使用 dotnet run 构建和执行程序。

$ cd <install-dir>/examples/netcoreapp3/HelloWorld-simple
$ dotnet run
Hello World!
Copy to Clipboard Toggle word wrap

3.3. 在 Microsoft Windows 上运行 Hello World

Hello World 示例创建了一个与代理的连接,发送一条消息,其中包含到 amq.topic 队列的问候队列,然后接收它。成功时,它会将收到的消息输出到控制台。

流程

  1. 导航到 &lt ;install-dir& gt;,并在 Visual Studio 中打开 amqp.sln 解决方案文件。
  2. Build 菜单中选择 Build Solution 来编译解决方案。
  3. 打开命令提示符窗口并执行以下命令来发送和接收信息:

    > cd <install-dir>\bin\Debug
    > HelloWorld-simple
    Hello World!
    Copy to Clipboard Toggle word wrap

第 4 章 例子

本章演示了通过示例程序使用 AMQ .NET。

如需了解更多示例,请参阅 AMQ .NET 示例套件和 AMQP.Net Lite 示例

4.1. 发送消息

此客户端程序使用 < connection-url > 连接到服务器,为目标 <address& gt; 创建发件人,发送一条消息,包含 <message-body >、关闭连接并退出。

示例:发送消息

namespace SimpleSend
{
    using System;
    using Amqp;                                                                 
1


    class SimpleSend
    {
        static void Main(string[] args)
        {
            string    url = (args.Length > 0) ? args[0] :                       
2

                "amqp://guest:guest@127.0.0.1:5672";
            string target = (args.Length > 1) ? args[1] : "examples";           
3

            int     count = (args.Length > 2) ? Convert.ToInt32(args[2]) : 10;  
4


            Address      peerAddr = new Address(url);                           
5

            Connection connection = new Connection(peerAddr);                   
6

            Session       session = new Session(connection);
            SenderLink     sender = new SenderLink(session, "send-1", target);  
7


            for (int i = 0; i < count; i++)
            {
                Message msg = new Message("simple " + i);                       
8

                sender.Send(msg);                                               
9

                Console.WriteLine("Sent: " + msg.Body.ToString());
            }

            sender.Close();                                                     
10

            session.Close();
            connection.Close();
        }
    }
}
Copy to Clipboard Toggle word wrap

1
使用 Amqp; 导入 Amqp 命名空间中定义的类型。AMQP 由项目引用 Amqp.Net.dll 定义,并提供与 AMQ .NET 关联的所有类、接口和值类型。
2
命令行 arg[0] url 是 AMQP 连接的主机或虚拟主机的网络地址。这个字符串描述了连接传输、用户和密码凭证,以及远程主机上连接的端口号。URL 可以处理路由器网络的代理、独立对等点或入口点。
3
命令行 arg[1] 目标是远程主机上消息目标端点或资源的名称。
4
命令行 arg[2] 计数 是要发送的消息数。
5
peerAddr 是创建 AMQP 连接所需的结构。
6
创建 AMQP 连接。
7
sender 是发送邮件的客户端 SenderLink。链接是任意命名的 send-1。使用环境中有意义的链接名称,并有助于识别忙碌系统中的流量。链接名称不受到限制,但在同一会话中必须唯一。
8
在消息中,发送循环将创建一个新消息。
9
该消息发送到 AMQP 对等点。
10
在所有消息发送后,协议对象将按顺序关闭。
运行示例

要运行示例程序,请编译程序并从命令行执行它。如需更多信息,请参阅 第 3 章 开始使用

<install-dir>\bin\Debug>simple_send "amqp://guest:guest@localhost" service_queue
Copy to Clipboard Toggle word wrap

4.2. 接收信息

此客户端程序使用 < connection-url > 连接到服务器,为源 <address& gt; 创建一个接收器,并接收信息直到终止或到达 < count> 信息。

示例:接收信息

namespace SimpleRecv
{
    using System;
    using Amqp;                                                                 
1


    class SimpleRecv
    {
        static void Main(string[] args)
        {
            string    url = (args.Length > 0) ? args[0] :                       
2

                "amqp://guest:guest@127.0.0.1:5672";
            string source = (args.Length > 1) ? args[1] : "examples";           
3

            int     count = (args.Length > 2) ? Convert.ToInt32(args[2]) : 10;  
4


            Address      peerAddr = new Address(url);                           
5

            Connection connection = new Connection(peerAddr);                   
6

            Session       session = new Session(connection);
            ReceiverLink receiver = new ReceiverLink(session, "recv-1", source);
7


            for (int i = 0; i < count; i++)
            {
                Message msg = receiver.Receive();                               
8

                receiver.Accept(msg);                                           
9

                Console.WriteLine("Received: " + msg.Body.ToString());
            }

            receiver.Close();                                                   
10

            session.Close();
            connection.Close();
        }
    }
}
Copy to Clipboard Toggle word wrap

1
使用 Amqp; 导入 Amqp 命名空间中定义的类型。AMQP 由项目引用 Amqp.Net.dll 定义,并提供与 AMQ .NET 关联的所有类、接口和值类型。
2
命令行 arg[0] url 是 AMQP 连接的主机或虚拟主机的网络地址。这个字符串描述了连接传输、用户和密码凭证,以及远程主机上连接的端口号。URL 可以处理路由器网络的代理、独立对等点或入口点。
3
命令行 arg[1] 源是远程主机上消息源端点或资源的名称。
4
命令行 arg[2] 计数 是要发送的消息数。
5
peerAddr 是创建 AMQP 连接所需的结构。
6
创建 AMQP 连接。
7
接收器 是一个客户端 ReceiverLink,可以接收该消息。链接是任意命名的 recv-1。使用环境中有意义的链接名称,并有助于识别忙碌系统中的流量。链接名称不受到限制,但在同一会话中必须唯一。
8
收到一条消息。
9
可以接受消息。这会将消息的所有权从对等点传输到接收器。
10
收到所有消息后,协议对象将按顺序关闭。
运行示例

要运行示例程序,请编译程序并从命令行执行它。如需更多信息,请参阅 第 3 章 开始使用

<install-dir>\bin\Debug>simple_recv "amqp://guest:guest@localhost" service_queue
Copy to Clipboard Toggle word wrap

第 5 章 网络连接

5.1. 连接 URI

本节描述了用于连接 AMQP 远程对等的连接 URI 字符串的标准格式。

 scheme = ( "amqp" | "amqps" )
 host = ( <fully qualified domain name> | <hostname> | <numeric IP address> )

 URI = scheme "://" [user ":" [password] "@"] host [":" port]
Copy to Clipboard Toggle word wrap
  • scheme amqp - connection 使用 TCP 传输,并将默认端口设置为 5672。
  • scheme amqps - 连接使用 SSL/TLS 传输,并将默认端口设置为 5671。
  • user - 可选连接身份验证用户名。如果存在 用户名,客户端会在连接启动期间启动 AMQP SASL 用户凭证交换。
  • password - 可选连接身份验证密码。
  • host - 定向到连接的网络主机。
  • port - 连接定向到的可选网络端口。默认端口 值由 AMQP 传输方案决定。

连接 URI 示例

amqp://127.0.0.1
amqp://amqpserver.example.com:5672
amqps://joe:somepassword@bigbank.com
amqps://sue:secret@test.example.com:21000
Copy to Clipboard Toggle word wrap

5.2. 重新连接和故障转移

AMQ .NET 不提供重新连接和故障转移,但可以通过截获连接错误和重新连接来在应用程序中实施。有关代码示例,请参阅 ReconnectSender.cs 示例

第 6 章 安全性

6.1. 使用用户和密码连接

AMQ .NET 可以使用用户和密码验证连接。

要指定用于身份验证的凭证,请在连接 URL 中设置 userpassword 字段。

示例:使用用户和密码连接

Address addr = new Address("amqp://<user>:<password>@example.com");
Connection conn = new Connection(addr);
Copy to Clipboard Toggle word wrap

6.2. 配置 SASL 身份验证

到远程对等点的客户端连接可以交换 SASL 用户名和密码凭证。连接 URI 中存在 user 字段控制此交换。如果指定了 user ,则交换 SASL 凭证;如果用户不存在,则不会交换 SASL 凭证。

默认情况下,客户端支持 EXTERNALPLAINANONYMOUS SASL 机制。

6.3. 配置 SSL/TLS 传输

与服务器的安全通信是通过 SSL/TLS 来实现的。客户端只能为 SSL/TLS Handshake 配置,或为 SSL/TLS Handshake 和客户端证书身份验证配置。如需更多信息,请参阅管理证书 部分。

注意

TLS Server Name Indication (SNI)由客户端库自动处理。但是,SNI 仅针对使用 amqps 传输协议的地址信号,其中主机是完全限定域名或主机名。当主机是数字 IP 地址时,SNI 不会发出信号。

第 7 章 发件人和接收器

客户端使用发送方和接收器链接来代表传递消息的频道。发件人和接收器是单向的,消息来源的源结尾和消息目的地的目标结尾。

源和目标通常指向消息代理上的队列或主题。源也用于代表订阅。

7.1. 根据需要创建队列和主题

有些消息服务器支持按需创建队列和主题。附加发送方或接收器时,服务器使用发送者目标地址或接收器源地址来创建名称与地址匹配的队列或主题。

邮件服务器通常默认为创建队列(用于一对一消息发送)或主题(用于一对多消息发送)。客户端可以通过在源或目标上设置 队列或主题 功能来指示首选情况。

要选择队列或主题语义,请按照以下步骤执行:

  1. 配置您的消息服务器,以自动创建队列和主题。这通常是默认配置。
  2. 在发送者目标或接收器源上设置 队列或主题 功能,如下例所示。

示例:发送到按需创建的队列

Target target = new Target() {
    Address = "jobs",
    Capabilities = new Symbol[] {"queue"},
};

SenderLink sender = new SenderLink(session, "s1", target, null);
Copy to Clipboard Toggle word wrap

示例:从按需创建的主题接收

Source source = new Source() {
    Address = "notifications",
    Capabilities = new Symbol[] {"topic"},
};

ReceiverLink receiver = new ReceiverLink(session, "r1", source, null);
Copy to Clipboard Toggle word wrap

如需更多信息,请参阅以下示例:

7.2. 创建持久订阅

持久化订阅是远程服务器上的一个状态,代表一个消息接收器。通常,当客户端关闭时,消息接收方会被丢弃。但是,由于持久订阅是持久的,客户端可以从它们分离,之后再重新连接。当客户端重新附加时,任何在分离时收到的消息都可用。

持久化订阅通过组合客户端容器 ID 和接收器名称来组成订阅 ID 来唯一标识。它们必须具有稳定的值,以便可以恢复订阅。

要创建持久订阅,请按照以下步骤执行:

  1. 将连接容器 ID 设置为 stable 值,如 client-1

    Connection conn = new Connection(new Address(connUrl),
                                     SaslProfile.Anonymous,
                                     new Open() { ContainerId = "client-1" },
                                     null);
    Copy to Clipboard Toggle word wrap
  2. 通过设置 DurableExpiryPolicy 属性来配置接收器源以实现持久性:

    Source source = new Source()
    {
        Address = "notifications",
        Durable = 2,
        ExpiryPolicy = new Symbol("never"),
    };
    Copy to Clipboard Toggle word wrap
  3. 使用稳定名称(如 sub-1 )创建一个接收器,并应用源属性:

    ReceiverLink receiver = new ReceiverLink(session, "sub-1", source, null);
    Copy to Clipboard Toggle word wrap

要从订阅分离,请在不明确关闭接收器的情况下关闭连接。要终止订阅,直接关闭接收器。

如需更多信息,请参阅 DurableSubscribe.cs 示例

7.3. 创建共享订阅

共享订阅是远程服务器中代表一个或多个消息接收器的状态。由于它是共享的,多个客户端可以从同一消息流使用。

客户端通过在接收器源上设置 共享功能来配置共享 订阅。

共享订阅通过组合客户端容器 ID 和接收器名称来组成订阅 ID 来唯一标识。它们必须具有稳定的值,以便多个客户端进程可以找到相同的订阅。如果除了 共享 外设置了 全局 功能,则仅接收方名称用于标识订阅。

要创建共享订阅,请按照以下步骤执行:

  1. 将连接容器 ID 设置为 stable 值,如 client-1

    Connection conn = new Connection(new Address(connUrl),
                                     SaslProfile.Anonymous,
                                     new Open() { ContainerId = "client-1" },
                                     null);
    Copy to Clipboard Toggle word wrap
  2. 通过设置共享功能来配置用于 共享的 接收器源:

    Source source = new Source()
    {
        Address = "notifications",
        Capabilities = new Symbol[] {"shared"},
    };
    Copy to Clipboard Toggle word wrap
  3. 使用稳定名称(如 sub-1 )创建一个接收器,并应用源属性:

    ReceiverLink receiver = new ReceiverLink(session, "sub-1", source, null);
    Copy to Clipboard Toggle word wrap

如需更多信息,请参阅 SharedSubscribe.cs 示例

第 8 章 消息交付

8.1. 发送消息

要发送消息,请创建一个连接、会话和发件人链接,然后使用 Message 对象调用 Sender.Send () 方法。

示例:发送消息

Connection connection = new Connection(new Address("amqp://example.com"));
Session session = new Session(connection);
SenderLink sender = new SenderLink(session, "sender-1", "jobs");

Message message = new Message("job-content");
sender.Send(message);
Copy to Clipboard Toggle word wrap

如需更多信息,请参阅 Send.cs 示例

8.2. 接收信息

要接收消息,请创建一个连接、会话和接收器链接,然后调用 Receiver.Receive () 方法,并使用返回的 Message 对象。

示例:接收信息

Connection connection = new Connection(new Address("amqp://example.com"));
Session session = new Session(connection);
ReceiverLink receiver = new ReceiverLink(session, "receiver-1", "jobs");

Message message = receiver.Receive();
receiver.Accept(message);
Copy to Clipboard Toggle word wrap

Receiver.Accept () 调用告知远程对等点接收和处理消息。

如需更多信息,请参阅 Receive.cs 示例

第 9 章 日志记录

日志记录在故障排除和调试中非常重要。默认情况下关闭日志记录。要启用日志记录,您必须设置日志级别,并提供委派功能来接收日志消息。

9.1. 设置日志输出级别

库在不同级别上发送日志跟踪:

  • Error
  • 警告
  • 信息
  • 详细

最低的日志级别 Error,仅跟踪错误事件并生成很少的日志消息。更高的日志级别包括它下面的所有日志级别,并生成大量日志消息。

// Enable Error logs only.
Trace.TraceLevel = TraceLevel.Error
Copy to Clipboard Toggle word wrap
// Enable Verbose logs. This includes logs at all log levels.
Trace.TraceLevel = TraceLevel.Verbose
Copy to Clipboard Toggle word wrap

9.2. 启用协议日志记录

日志级别 的处理方式不同。设置 trace 级别 可为 AMQP 协议标头和帧启用追踪输出。

在其它日志级别之一时,追踪必须以逻辑方式 ORed 和 Frame 获取常规追踪输出和 AMQP 框架追踪。例如:

// Enable just AMQP frame tracing
Trace.TraceLevel = TraceLevel.Frame;
Copy to Clipboard Toggle word wrap
// Enable AMQP Frame logs, and Warning and Error logs
Trace.TraceLevel = TraceLevel.Frame | TraceLevel.Warning;
Copy to Clipboard Toggle word wrap

以下代码将 AMQP 帧写入控制台。

示例:日志记录委托

Trace.TraceLevel = TraceLevel.Frame;
Trace.TraceListener = (f, a) => Console.WriteLine(
        DateTime.Now.ToString("[hh:mm:ss.fff]") + " " + string.Format(f, a));
Copy to Clipboard Toggle word wrap

第 10 章 互操作性

本章讨论了如何将 AMQ .NET 与其他 AMQ 组件一起使用。有关 AMQ 组件的兼容性概述,请参阅 产品简介

10.1. 与其他 AMQP 客户端交互

AMQP 消息使用 AMQP 类型系统 组成。这种通用格式是以不同语言的 AMQP 客户端能够相互互操作的原因之一。

发送消息时,AMQ .NET 会自动将语言原生类型转换为 AMQP 编码数据。收到信息时,反向转换就发生。

注意

有关 AMQP 类型的更多信息,请访问由 Apache Qpid 项目维护 的交互式类型参考

Expand
表 10.1. AMQP 类型
AMQP 类型描述

null

一个空值

布尔值

true 或 false 值

char

单个 Unicode 字符

string

一系列 Unicode 字符

二进制

一个字节序列

byte

签名的 8 位整数

short

签名的 16 位整数

int

签名的 32 位整数

long

签名的 64 位整数

ubyte

未签名的 8 位整数

ushort

未签名的 16 位整数

uint

未签名的 32 位整数

ulong

未签名的 64 位整数

浮点值

32 位浮点号

double

64 位浮点号

数组

单个类型的值的序列

list

变量类型的序列值

map

从不同键到值的映射

uuid

通用唯一标识符

符号

来自受限域的 7 位 ASCII 字符串

timestamp

一个绝对时间点

Expand
表 10.2. 在编码前和解码后 AMQ .NET 类型
AMQP 类型编码前的 AMQ .NET 类型解码后 AMQ .NET 类型

null

null

null

布尔值

system.Boolean

system.Boolean

char

system.Char

system.Char

string

system.String

system.String

二进制

System.Byte[]

System.Byte[]

byte

system.SByte

system.SByte

short

System.Int16

System.Int16

int

System.Int32

System.Int32

long

System.Int64

System.Int64

ubyte

system.Byte

system.Byte

ushort

System.UInt16

System.UInt16

uint

System.UInt32

System.UInt32

ulong

System.UInt64

System.UInt64

浮点值

system.Single

system.Single

double

system.Double

system.Double

list

Amqp.List

Amqp.List

map

Amqp.Map

Amqp.Map

uuid

system.Guid

system.Guid

符号

Amqp.Symbol

Amqp.Symbol

timestamp

System.DateTime

System.DateTime

Expand
表 10.3. AMQ .NET 和其他 AMQ 客户端类型(1 为 2)
编码前的 AMQ .NET 类型AMQ C++ 类型AMQ JavaScript 类型

null

nullptr

null

system.Boolean

bool

布尔值

system.Char

wchar_t

number

system.String

std::string

string

System.Byte[]

proton::binary

string

system.SByte

int8_t

number

System.Int16

int16_t

number

System.Int32

int32_t

number

System.Int64

int64_t

number

system.Byte

uint8_t

number

System.UInt16

uint16_t

number

System.UInt32

uint32_t

number

System.UInt64

uint64_t

number

system.Single

浮点值

number

system.Double

double

number

Amqp.List

std::vector

Array

Amqp.Map

std::map

object

system.Guid

proton::uuid

number

Amqp.Symbol

proton::symbol

string

System.DateTime

proton::timestamp

number

Expand
表 10.4. AMQ .NET 和其他 AMQ 客户端类型(2 为 2)
编码前的 AMQ .NET 类型AMQ Python 类型AMQ Ruby 类型

null

nil

system.Boolean

bool

true, false

system.Char

unicode

字符串

system.String

unicode

字符串

System.Byte[]

bytes

字符串

system.SByte

int

整数

System.Int16

int

整数

System.Int32

long

整数

System.Int64

long

整数

system.Byte

long

整数

System.UInt16

long

整数

System.UInt32

long

整数

System.UInt64

long

整数

system.Single

浮点值

浮点值

system.Double

浮点值

浮点值

Amqp.List

list

Array

Amqp.Map

dict

hash

system.Guid

-

-

Amqp.Symbol

str

符号

System.DateTime

long

Time

10.2. 使用 AMQ JMS 进行交互

AMQP 定义标准映射到 JMS 消息传递模型。本节讨论该映射的各个方面。如需更多信息,请参阅 AMQ JMS Interoperability 章节。

JMS 消息类型

AMQ .NET 提供单个消息类型,其正文类型可能会有所不同。相反,JMS API 使用不同的消息类型来代表不同类型的数据。下表标明特定的正文类型如何映射到 JMS 消息类型。

若要更明确地控制生成的 JMS 消息类型,您可以设置 x-opt-jms-msg-type 消息注释。如需更多信息,请参阅 AMQ JMS Interoperability 章节。

Expand
表 10.5. AMQ .NET 和 JMS 消息类型
AMQ .NET 正文类型JMS 消息类型

system.String

TextMessage

null

TextMessage

System.Byte[]

BytesMessage

任何其他类型

ObjectMessage

10.3. 连接到 AMQ Broker

AMQ Broker 旨在与 AMQP 1.0 客户端互操作。检查以下内容以确保为 AMQP 消息传递配置了代理:

附录 A. 管理证书

A.1. 安装证书颁发机构证书

SSL/TLS 身份验证依赖于受信任的证书颁发机构(CA)发布的数字证书。当由客户端建立 SSL/TLS 连接时,AMQP 对等点向客户端发送服务器证书。此服务器证书必须由客户端的 受信任的根证书颁发机构 证书存储中的其中一个 CA 签名。

如果用户正在创建自签名证书以供 Red Hat AMQ Broker 使用,则用户必须创建一个 CA 来签署证书。然后,用户可以通过安装自签名 CA 文件 ca.crt 来启用客户端 SSL/TLS 握手。

  1. 在管理员命令提示符中运行 MMC 证书管理器插件 certmgr.msc
  2. 展开左侧的 受信任的根证书颁发机构 文件夹,以公开 证书
  3. 右键点击 Certificates 并选择 All Tasks,然后选择
  4. 点击 Next
  5. 浏览以选择文件 ca.crt
  6. 点击 Next
  7. 选择 Place 以下存储中的所有证书
  8. 选择证书存储 受信任的根证书颁发机构
  9. 点击 Next
  10. Finish

有关安装证书的更多信息,请参阅管理 Microsoft 证书服务和 SSL

A.2. 安装客户端证书

要使用 SSL/TLS 和客户端证书,客户端的私钥的证书必须导入到客户端系统上的正确证书存储中。

  1. 在管理员命令提示符中运行 MMC 证书管理器插件 certmgr.msc
  2. 展开左侧的 Personal 文件夹,以公开 证书
  3. 右键点击 Certificates 并选择 All Tasks,然后选择
  4. 点击 Next
  5. Browse
  6. 在文件类型下拉列表中,选择 Personal Information Exchange (\.pfx;*.p12)
  7. 选择文件 client.p12,然后单击 Open
  8. Next。
  9. 输入私钥密码字段的密码。接受默认导入选项。
  10. 点击 Next
  11. 选择 Place 以下存储中的所有证书
  12. 选择证书存储 个人
  13. 点击 Next
  14. Finish

A.3. 使用客户端证书 hello World

在客户端向代理返回证书前,必须告知 AMQ .NET 库要使用的证书。客户端证书文件 client.crt 添加到在 SChannel 连接启动过程中使用的证书列表中。

factory.SSL.ClientCertificates.Add(
    X509Certificate.CreateFromCertFile(certfile)
    );
Copy to Clipboard Toggle word wrap

在本例中,certfile 是个人证书存储中安装的 client.p12 证书的完整路径。HelloWorld-client-certs.cs 中找到了一个完整的示例。SDK 中提供了此源文件和支持的项目文件。

附录 B. 程序示例

B.1. 先决条件

  • Red Hat AMQ Broker,带有名为 amq.topic 的队列,以及名为 service_queue 的队列,其具有读/写权限。在本图例中,代理位于 IP 地址 10.10.1.1
  • 带有源和目标名称 amq.topic 的 Red Hat AMQ Interconnect 带有适当的权限。为此,路由器位于 IP 地址 10.10.2.2

所有示例都从 < install-dir>\bin\Debug 运行。

B.2. helloworld 简单

helloworld-simple 是一个简单示例,它为同一地址创建一个 Sender 和 Receiver,向地址发送消息,从地址读取消息并打印结果。

helloworld-simple 命令行选项
 Command line:
   HelloWorld-simple [brokerUrl [brokerEndpointAddress]]
 Default:
   HelloWorld-simple amqp://localhost:5672 amq.topic
Copy to Clipboard Toggle word wrap
helloworld-simple 示例调用
$ HelloWorld-simple
Hello world!
Copy to Clipboard Toggle word wrap

默认情况下,该程序连接到在 localhost:5672 上运行的代理。在命令行中明确指定主机和端口,以及 AMQP 端点地址:

$ HelloWorld-simple amqp://someotherhost.com:5672 endpointname
Copy to Clipboard Toggle word wrap

默认情况下,该程序将其消息解析为 amq.topic。在一些 Amqp 代理 amq.topic 中,是一个预定义的端点地址,它会立即在没有代理配置的情况下可用。如果代理中不存在这个地址,则使用代理管理工具创建它。

B.3. helloworld 稳定

helloworld-robust 与附加选项和处理共享简单示例的所有功能:

  • 访问简单有效负载之外的消息属性:

    • 标头
    • DeliveryAnnotations
    • MessageAnnotations
    • Properties
    • ApplicationProperties
    • BodySection
    • footer
  • 连接关闭序列
helloworld-robust 命令行选项
 Command line:
   HelloWorld-robust [brokerUrl [brokerEndpointAddress [payloadText [enableTrace]]]]
 Default:
   HelloWorld-robust amqp://localhost:5672 amq.topic "Hello World"
Copy to Clipboard Toggle word wrap
注意

enableTrace 参数的简单存在启用追踪。参数可以保存任何值。

helloworld-robust 示例调用
$ HelloWorld-robust
Broker: amqp://localhost:5672, Address: amq.topic, Payload: Hello World!
body:Hello World!
Copy to Clipboard Toggle word wrap

helloworld-robust 允许用户指定有效负载字符串并启用 trace 协议日志记录。

$ HelloWorld-robust amqp://localhost:5672 amq.topic "My Hello" loggingOn
Copy to Clipboard Toggle word wrap

AMQ .NET 示例 Interop.DrainInterop.Spout 演示了与 Red Hat AMQ Interconnect 的交互。在这种情况下,没有消息代理。相反,Red Hat AMQ Interconnect 会注册客户端程序请求的地址,并在它们之间路由信息。

Interop.Drain 命令行选项
 $ Interop.Drain.exe --help
 Usage: interop.drain [OPTIONS] --address STRING
 Create a connection, attach a receiver to an address, and receive messages.

 Options:
  --broker [amqp://guest:guest@127.0.0.1:5672] - AMQP 1.0 peer connection address
  --address STRING     []      - AMQP 1.0 terminus name
  --timeout SECONDS    [1]     - time to wait for each message to be received
  --forever            [false] - use infinite receive timeout
  --count INT          [1]     - receive this many messages and exit; 0 disables count based exit
  --initial-credit INT [10]    - receiver initial credit
  --reset-credit INT   [5]     - reset credit to initial-credit every reset-credit messages
  --quiet              [false] - do not print each message's content
  --help                       - print this message and exit

 Exit codes:
  0 - successfully received all messages
  1 - timeout waiting for a message
  2 - other error
Copy to Clipboard Toggle word wrap
Interop.Spout 命令行选项
 $ interop.spout --help
 Usage: Interop.Spout [OPTIONS] --address STRING
 Create a connection, attach a sender to an address, and send messages.

 Options:
  --broker [amqp://guest:guest@127.0.0.1:5672] - AMQP 1.0 peer connection address
  --address STRING  []      - AMQP 1.0 terminus name
  --timeout SECONDS [0]     - send for N seconds; 0 disables timeout
  --durable         [false] - send messages marked as durable
  --count INT       [1]     - send this many messages and exit; 0 disables count based exit
  --id STRING       [guid]  - message id
  --replyto STRING  []      - message ReplyTo address
  --content STRING  []      - message content
  --print           [false] - print each message's content
  --help                    - print this message and exit

 Exit codes:
  0 - successfully received all messages
  2 - other error
Copy to Clipboard Toggle word wrap
Interop.Spout 和 Interop.Drain 示例调用

在一个窗口中运行 Interop.drain。排空会等待一条消息到达。

$ Interop.Drain.exe --broker amqp://10.10.2.2:5672 --forever --count 1 --address amq.topic
Copy to Clipboard Toggle word wrap

在另一个窗口中运行 Interop.spout。Spout 会向代理地址发送消息并退出。

$ interop.spout --broker amqp://10.10.2.2:5672 --address amq.topic
$
Copy to Clipboard Toggle word wrap

现在,在第一个窗口中,排空信息将收到 spout 信息,然后退出。

$ Interop.Drain.exe --broker amqp://10.10.2.2:5672 --forever --count 1 --address amq.topic
Message(Properties=properties(message-id:9803e781-14d3-4fa7-8e39-c65e18f3e8ea:0), ApplicationProperties=, Body=
$
Copy to Clipboard Toggle word wrap

B.5. Interop.Client, Interop.Server (request-response)

本例演示了基于代理的简单服务器,它将接受来自客户端的字符串,将其转换为大写,并将它们发回到客户端。它有两个组件:

  • client - 向服务器发送行并打印响应。
  • server - 将传入的字符串转换为大写的简单服务,并将它们返回到请求者。

在本例中,服务器和客户端共享名为 service_queue 的代理中的服务端点。服务器在服务端点中侦听消息。客户端创建临时动态 ReplyTo 队列,将临时名称嵌入到请求中,并将请求发送到服务器。在接收和处理每个请求后,服务器会将回复发送到客户端的临时 ReplyTo 地址。

Interop.Client 命令行选项
 Command line:
   Interop.Client [peerURI [loopcount]]
 Default:
   Interop.Client amqp://guest:guest@localhost:5672 1
Copy to Clipboard Toggle word wrap
Interop.Server 命令行选项
 Command line:
   Interop.Server [peerURI]
 Default:
   Interop.Server amqp://guest:guest@localhost:5672
Copy to Clipboard Toggle word wrap
Interop.Client, Interop.Server sample invocation

可使用这些命令行启动程序:

$ Interop.Server.exe amqp://guest:guest@localhost:5672
$ Interop.Client.exe amqp://guest:guest@localhost:5672
Copy to Clipboard Toggle word wrap

PeerToPeer.Server 在命令行给出的地址上创建一个监听程序。此地址初始化侦听传入连接的 ContainerHost 类对象。接收的消息异步转发到 RequestProcessor 类对象。

PeerToPeer.Client 会打开与服务器的连接,并开始向服务器发送消息。

PeerToPeer.Client 命令行选项
 Command line:
   PeerToPeer.Client [peerURI]
 Default:
   PeerToPeer.Client amqp://guest:guest@localhost:5672
Copy to Clipboard Toggle word wrap
PeerToPeer.Server 命令行选项
 Command line:
   PeerToPeer.Server [peerURI]
 Default:
   PeerToPeer.Server amqp://guest:guest@localhost:5672
Copy to Clipboard Toggle word wrap
PeerToPeer.Client, PeerToPeer.Server 示例调用

在一个窗口中运行 PeerToPeer.Server

$ PeerToPeer.Server.exe
Container host is listening on 127.0.0.1:5672
Request processor is registered on request_processor
Press enter key to exist...
Received a request hello 0
...
Copy to Clipboard Toggle word wrap

在另一个窗口中,运行 PeerToPeer.Client。PeerToPeer.Client 发送消息服务器,并在收到响应时打印响应。

$ PeerToPeer.Client.exe
Running request client...
Sent request properties(message-id:command-request,reply-to:client-57db8f65-6e3d-474c-a05e-8ca63b69d7c0) body hello 0
Received response:  body reply0
Received response:  body reply1
^C
Copy to Clipboard Toggle word wrap

附录 C. 使用您的订阅

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

C.1. 访问您的帐户

流程

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

C.2. 激活订阅

流程

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

C.3. 下载发行文件

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

流程

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

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

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

流程

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

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

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

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

D.1. 安装代理

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

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

D.2. 启动代理

流程

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

    $ <broker-instance-dir>/bin/artemis run
    Copy to Clipboard Toggle word wrap
  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
    ...
    Copy to Clipboard Toggle word wrap

D.3. 创建队列

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

$ <broker-instance-dir>/bin/artemis queue create --name amq.topic --address amq.topic --auto-create-address --anycast
Copy to Clipboard Toggle word wrap

系统将提示您回答一系列 yes 或没有问题。全部答案为 N

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

D.4. 停止代理

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

$ <broker-instance-dir>/bin/artemis stop
Copy to Clipboard Toggle word wrap

更新于 2023-09-26

法律通告

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 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

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

Theme

© 2025 Red Hat