AMQP
ActiveMQ Classic 支援 AMQP 1.0 協定,這是一個 OASIS 標準。
可用性
從 ActiveMQ Classic 版本 5.8 開始提供。
為 AMQP 啟用 ActiveMQ Classic Broker
若要在代理程式上啟用 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 |
字串 |
二進位值的十六進位編碼 |
bool |
布林值 |
|
byte |
位元組 |
|
double |
雙精度浮點數 |
|
float |
浮點數 |
|
int |
整數 |
|
long |
長整數 |
|
short |
短整數 |
|
symbol |
字串 |
|
ubyte |
Byte 或 Short |
如果:value > Byte.MAX_VALUE ,則使用 Short |
uint |
Integer 或 Long |
如果:value > Integer.MAX_VALUE ,則使用 Long |
ulong |
長整數 |
|
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。