AMQP
ActiveMQ Classic 支持 AMQP 1.0 协议,该协议是 OASIS 标准。
可用性
从 ActiveMQ Classic 版本 5.8 开始提供。
启用 ActiveMQ Classic Broker 的 AMQP
要在代理上启用 AMQP 协议支持,请添加以下传输连接器配置,并在其 URI 中引用 amqp
方案
<transportConnectors>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672"/>
</transportConnectors>
它在默认的 ActiveMQ Classic 服务器配置中已启用。如需更多帮助,请参见 运行代理。
安全
AMQP 实现完全支持 ActiveMQ Classic 安全性 机制。这允许代理接受纯 SASL 身份验证。当访问 (读/写) 目标时,将应用授权策略。
SSL
为了额外的安全性,可以将 AMQP 配置为在 SSL 上运行,如下一节所述。
启用 NIO 上的 AMQP
为了获得更好的可扩展性 (和性能),AMQP 协议应配置为使用 NIO,而不是默认的 TCP。要使用 NIO,请使用传输方案 amqp+nio
而不是 amqp
。
示例
<transportConnector name="amqp+nio" uri="amqp+nio://127.0.0.1:5672"/>
此传输使用 NIO 传输,通常比标准连接器使用更少的线程。如果您想使用 大量队列,此连接器可以提供帮助。
启用 SSL 上的 AMQP
将 ActiveMQ Classic 配置为使用 SSL 连接上的 AMQP 很容易。要使用 SSL,请使用传输方案 amqp+ssl
而不是 amqp
。
示例
<transportConnector name="amqp+ssl" uri="amqp+ssl://127.0.0.1:5671"/>
有关在 ActiveMQ Classic 中使用 SSL 的更多详细信息,请参阅以下文章 (如何使用 SSL)。
使用 AMQP 处理目标
您应该在目标地址前添加 queue://
以使用基于队列的目标,或添加 topic://
以使用基于主题的目标。如果省略目标前缀,则目标类型默认为队列。
预取大小和信用
当 AMQP 接收器连接到代理时,它将映射到 JMS 消费者。此 JMS 消费者必须具有适当的 预取大小 设置。代理将遵守客户端设置的信用,或者如果客户端未设置信用,则使用默认值 1000
。
示例:调整默认的 prefetch
大小
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600&transport.prefetch=10"/>
在这种情况下,客户端首选项将被忽略,并将使用配置的值。
您还可以调整代理端的 amqp
接收器链接,该链接处理传入消息。它默认使用 1000
条消息的信用,但您可以使用 producerCredit
属性覆盖它,例如
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600&transport.producerCredit=10000"/>
映射到 JMS
有三种基本转换策略可用于 AMQP 并与 JMS API 交互操作。
策略 | 描述 |
---|---|
native |
(默认) 将 AMQP 消息的字节包装到 JMS BytesMessage 中,并将 AMQP 消息的标头映射到 JMS 消息上的标头。 |
raw |
将 AMQP 消息的字节包装到 JMS BytesMessage 中。 |
jms |
将 AMQP 消息的标头映射到 JMS 消息标头,并将 AMQP 消息的主体映射到 JMS 主体。 |
在 transportConnector
上设置 transformer 传输选项以获得所需的映射策略。例如,要在有效负载级别与 JMS 交互操作,请将 transformer
选项设置为 jms
<transportConnector name="amqp" uri="amqp://127.0.0.1:5672?transport.transformer=jms"/>
AMQP 消息标头如何映射到 JMS 标头
以下标头将映射,而与使用的转换器无关
AMQP 消息 | JMS 消息 | 备注 |
---|---|---|
JMS_AMQP_NATIVE |
如果转换器是 native 或 raw ,则设置为 true ,否则设置为 false 。 |
|
message-format |
JMS_AMQP_MESSAGE_FORMAT |
当转换器是 native
或 jms
时,以下标头映射适用
AMQP 消息 | JMS 消息 | 备注 |
---|---|---|
application-properties.JMSXGroupID |
JMSXGroupID |
|
application-properties.JMSXGroupSequence |
JMSXGroupSequence |
|
application-properties.JMSXUserID |
JMSXUserID |
|
application-properties.**name |
name |
|
delivery-annotations.**name |
JMS_AMQP_DA_**name |
|
footer.**name |
JMS_AMQP_FT_**name |
|
header.deliveryCount |
JMSXDeliveryCount |
|
header.durable |
JMSDeliveryMode |
如果没有设置,则为 javax.jms.Message.DEFAULT_DELIVERY_MODE 。 |
header.first-acquirer |
JMS_AMQP_FirstAcquirer |
|
header.priority |
JMSPriority |
如果没有设置,则为 javax.jms.Message.DEFAULT_PRIORITY 。 |
header.ttl |
JMSExpiration |
如果没有设置,则为 javax.jms.Message.DEFAULT_TIME_TO_LIVE 。 |
message-annotations.**name |
JMS_AMQP_MA_**name |
|
message-annotations.x-opt-jms-type |
JMSType |
|
message-annotations.x-opt-reply-type |
的类型 JMSReplyTo |
逗号分隔的 queue 、topic 或 temporary 列表。如果没有设置,则默认为 queue 。 |
message-annotations.x-opt-to-type |
的类型 JMSDestination |
逗号分隔的 queue 、topic 或 temporary 列表。如果没有设置,则默认为 queue 。 |
properties.content-encoding |
JMS_AMQP_ContentEncoding |
|
properties.content-type |
JMS_AMQP_ContentType |
|
properties.correlation-id |
JMSCorrelationID |
|
properties.creation-time |
JMSTimestamp |
|
properties.group-sequence |
JMSXGroupSequence |
|
properties.message-id |
JMSMessageID |
如果没有设置,则自动生成。 |
properties.reply-to |
JMSReplyTo |
的名称 JMSReplyTo |
properties.reply-to-group-id |
JMS_AMQP_ReplyToGroupID |
|
properties.subject |
JMS_AMQP_Subject |
|
properties.to |
JMSDestination |
的名称 JMSDestination |
properties.user-id |
JMSXUserID |
properties.user-id 被解码为 UTF-8 字符串。 |
AMQP 属性值类型将按如下方式转换
AMQP 类型 | Java 类型 | 备注 |
---|---|---|
binary |
String |
二进制值的十六进制编码 |
bool |
Boolean |
|
byte |
Byte |
|
double |
Double |
|
float |
Float |
|
int |
Integer |
|
long |
Long |
|
short |
Short |
|
symbol |
String |
|
ubyte |
Byte 或 Short |
如果:value > Byte.MAX_VALUE ,则使用 Short |
uint |
Integer 或 Long |
如果:value > Integer.MAX_VALUE ,则使用 Long |
ulong |
Long |
|
ushort |
Short 或 Integer |
如果:value > Short.MAX_VALUE ,则使用 Integer |
AMQP 消息主体如何映射到 JMS 消息
如果将转换器设置为 jms
,则 JMS 消息类型将取决于 AMQP 消息的主体类型。
主体类型 | JMS 消息类型 |
---|---|
AmqpSequence |
StreamMessage |
AmqpValue |
ObjectMessage |
AmqpValue 持有 null |
Message |
AmqpValue 持有 String |
TextMessage |
AmqpValue 持有 binary |
BytesMessage |
AmqpValue 持有 list |
StreamMessage |
Data |
BytesMessage |
null |
Message |
AMQP 1.0 客户端库
您可以使用 Apache Qpid Proton。