blob: a3751ffd26e1b6437694c630e9890a6637c6ba12 [file] [log] [blame]
<div class="wiki-content maincontent"><p>ActiveMQ supports the <a shape="rect" class="external-link" href="https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=amqp" rel="nofollow">AMQP 1.0</a> protocol which is an OASIS standard.</p><div class="confluence-information-macro confluence-information-macro-information"><p class="title">Availability</p><span class="aui-icon aui-icon-small aui-iconfont-info confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>Available from ActiveMQ version <a shape="rect" href="activemq-580-release.xml">5.8</a> onward.</p></div></div><h3 id="AMQP-EnablingtheActiveMQBrokerforAMQP">Enabling the ActiveMQ Broker for AMQP</h3><p>To enable AMQP protocol support on the broker add the following transport connector configuration referencing the&#160;<strong><code>amqp</code></strong> scheme in its URI:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<script class="brush: java; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[&lt;transportConnectors&gt;
&lt;transportConnector name=&quot;amqp&quot; uri=&quot;amqp://0.0.0.0:5672&quot;/&gt;
&lt;/transportConnectors&gt;
]]></script>
</div></div><p>It is enabled in the default ActiveMQ server configuration. For more help see <a shape="rect" href="run-broker.xml">Run Broker</a>.</p><h3 id="AMQP-Security">Security</h3><p>The AMQP implementation fully supports an <a shape="rect" href="security.xml">ActiveMQ security</a> mechanism. This allows the broker to accept plain SASL authentication. Authorization policies are applied to a destination when it's accessed (read/write).</p><div class="confluence-information-macro confluence-information-macro-tip"><p class="title">SSL</p><span class="aui-icon aui-icon-small aui-iconfont-approve confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>For additional security AMQP can be configured to run over SSL as described in the following section.</p></div></div><h3 id="AMQP-EnablingAMQPoverNIO">Enabling AMQP over NIO</h3><p>For better scalability (and performance) the AMQP protocol should be configured to use NIO, rather than the default of TCP. To use NIO use the transport scheme <strong><code>amqp+nio</code></strong> instead of <strong><code>amqp</code></strong>.</p><p>Example:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<script class="brush: java; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[&lt;transportConnector name=&quot;amqp+nio&quot; uri=&quot;amqp+nio://localhost:5672&quot;/&gt;
]]></script>
</div></div><p>This transport uses the <a shape="rect" class="external-link" href="http://activemq.apache.org/configuring-transports.html#ConfiguringTransports-TheNIOTransport">NIO transport</a> underneath and will generally use much less threads than the standard connector. This connector can help if you want to use <a shape="rect" class="external-link" href="http://activemq.apache.org/how-do-i-configure-10s-of-1000s-of-queues-in-a-single-broker-.html">large number of queues</a></p><h3 id="AMQP-EnablingAMQPoverSSL">Enabling AMQP over SSL</h3><p>It's easy to configure ActiveMQ to use AMQP over a SSL connection. To use SSL use the transport scheme <strong><code>amqp+ssl</code></strong> instead of <strong><code>amqp</code></strong>.</p><p>Example:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<script class="brush: java; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[&lt;transportConnector name=&quot;amqp+ssl&quot; uri=&quot;amqp+ssl://localhost:5671&quot;/&gt;
]]></script>
</div></div><p>For more details on using SSL with ActiveMQ, see the following article (<a shape="rect" class="external-link" href="http://activemq.apache.org/how-do-i-use-ssl.html">How do I use SSL</a>).</p><h3 id="AMQP-WorkingwithDestinationswithAMQP">Working with Destinations with AMQP</h3><p>You should prefix destination address with&#160;<strong><code>queue://</code></strong> to use queue based destinations or&#160;<strong><code>topic://</code></strong> to use topic based destinations. The destination type defaults to queue when the destination prefix is omitted.</p><h3 id="AMQP-PrefetchSizeandCredit">Prefetch Size and Credit</h3><p>When AMQP receiver connects to the broker it's mapped to the JMS consumer. This JMS consumer has to have appropriate <a shape="rect" href="what-is-the-prefetch-limit-for.xml">prefetch size</a> set.&#160;<span style="line-height: 1.4285715;">The broker will honor the credit set by the client or use the default value of&#160;<strong><code>1000</code></strong> if client doesn't set it.</span></p><p>Example: tuning the default <strong><code>prefetch</code></strong> size:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<script class="brush: xml; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[&lt;transportConnector name=&quot;amqp&quot; uri=&quot;amqp://0.0.0.0:5672?maximumConnections=1000&amp;amp;wireFormat.maxFrameSize=104857600&amp;amp;transport.prefetch=10&quot;/&gt;]]></script>
</div></div><p class="p1">In this case, client preference will be ignored and the configured value will be used.</p><p class="p1">You can also tune broker-side&#160;<strong><code>amqp</code></strong> receiver link that handles incoming messages. It will use credit of&#160;<strong><code>1000</code></strong> messages by default, but you can override this by using&#160;<span><strong><code>producerCredit</code></strong> property, like&#160;</span></p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<script class="brush: xml; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[&lt;transportConnector name=&quot;amqp&quot; uri=&quot;amqp://0.0.0.0:5672?maximumConnections=1000&amp;amp;wireFormat.maxFrameSize=104857600&amp;amp;transport.producerCredit=10000&quot;/&gt;]]></script>
</div></div><h3 id="AMQP-MappingtoJMS">Mapping to JMS</h3><p>There are three basic conversion strategies that can be used with AMQP and inter-operating with the JMS API.</p><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>Strategy</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Description</p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>native</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>(<strong>Default</strong>) Wraps the bytes of the AMQP message into a JMS&#160;<strong><code>BytesMessage</code></strong> and maps the headers of the AMQP message to headers on the JMS message.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>raw</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Wraps the bytes of the AMQP message into a JMS <strong><code>BytesMessage</code></strong>.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>jms</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Maps headers of the AMQP message to JMS message headers and the body of the AMQP message to the JMS body.</p></td></tr></tbody></table></div><p>Set the <strong>transformer</strong> transport option on the&#160;<strong><code>transportConnector</code></strong> to the desired mapping strategy. For example, to inter-operate with JMS at the payload level, set the <strong><code>transformer</code></strong> option to <strong><code>jms</code></strong>:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<script class="brush: java; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[&lt;transportConnector name=&quot;amqp&quot; uri=&quot;amqp://localhost:5672?transport.transformer=jms&quot;/&gt;
]]></script>
</div></div><h4 id="AMQP-HowAMQPMessageHeadersareMappedtoJMSHeaders">How AMQP Message Headers are Mapped to JMS Headers</h4><p>The following headers are mapped regardless of the transformer used:</p><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>AMQP Message</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>JMS Message</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Notes</p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMS_AMQP_NATIVE</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Will be set to&#160;<strong><code>true</code></strong> if the transformer is&#160;<strong><code>native</code></strong> or <strong><code>raw</code></strong>,&#160;<strong><code>false</code></strong> otherwise.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>message-format</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMS_AMQP_MESSAGE_FORMAT</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr></tbody></table></div><p>The following header mappings apply when the transformer is either <strong><code>native</code></strong> or <strong><code>jms</code></strong>:</p><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>AMQP Message</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>JMS Message</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Notes</p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>application-properties.JMSXGroupID</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMSXGroupID</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>application-properties.JMSXGroupSequence</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMSXGroupSequence</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>application-properties.JMSXUserID</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMSXUserID</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>application-properties.<u><strong>name</strong></u></code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><u><strong><code>name</code></strong></u></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>delivery-annotations.<u><strong>name</strong></u></code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMS_AMQP_DA_<u><strong>name</strong></u></code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>footer.<u><strong>name</strong></u></code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMS_AMQP_FT_<u><strong>name</strong></u></code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>header.deliveryCount</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMSXDeliveryCount</code></p></td><td colspan="1" rowspan="1" class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>header.durable</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMSDeliveryMode</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong><code>javax.jms.Message.DEFAULT_DELIVERY_MODE</code></strong> if not set.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>header.first-acquirer</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMS_AMQP_FirstAcquirer</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>header.priority</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMSPriority</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong><code>javax.jms.Message.DEFAULT_PRIORITY</code></strong> if not set.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>header.ttl</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMSExpiration</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong><code>javax.jms.Message.DEFAULT_TIME_TO_LIVE</code></strong> if not set.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>message-annotations.<u><strong>name</strong></u></code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMS_AMQP_MA_<u><strong>name</strong></u></code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>message-annotations.x-opt-jms-type</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMSType</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>message-annotations.x-opt-reply-type</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Type of the&#160;<code>JMSReplyTo</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Comma separated list of <strong><code>queue</code></strong>, <strong><code>topic</code></strong>, or <strong><code>temporary</code></strong>. Defaults to&#160;<strong><code>queue</code></strong> if not set.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>message-annotations.x-opt-to-type</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Type of the&#160;<code>JMSDestination</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Comma separated list of <strong><code>queue</code></strong>, <strong><code>topic</code></strong>, or <strong><code>temporary</code></strong>. Defaults to&#160;<strong><code>queue</code></strong> if not set.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>properties.content-encoding</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMS_AMQP_ContentEncoding</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>properties.content-type</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMS_AMQP_ContentType</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>properties.correlation-id</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMSCorrelationID</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>properties.creation-time</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMSTimestamp</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>properties.group-sequence</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMSXGroupSequence</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>properties.message-id</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMSMessageID</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Auto generated if not set.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>properties.reply-to</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMSReplyTo</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>The name of the&#160;<strong><code>JMSReplyTo</code></strong></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>properties.reply-to-group-id</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMS_AMQP_ReplyToGroupID</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>properties.subject</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMS_AMQP_Subject</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>properties.to</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMSDestination</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>The name of the&#160;<strong><code>JMSDestination</code></strong></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>properties.user-id</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>JMSXUserID</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong><code>properties.user-id</code></strong> is decoded as a UTF-8 String.</p></td></tr></tbody></table></div><p>&#160;</p><p>AMQP property value types are converted as follows:</p><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>AMQP Type</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Java Type</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Notes</p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>binary</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>String</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Hex encoding of the binary value</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>bool</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>Boolean</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>byte</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>Byte</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>double</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>Double</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>float</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>Float</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>int</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>Integer</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>long</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>Long</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>short</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>Short</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>symbol</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>String</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>ubyte</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>Byte</code> or&#160;<code>Short</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong><code>Short</code></strong> is used if: <strong><code>value &gt;</code></strong> <strong><code>Byte.MAX_VALUE</code></strong></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>uint</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>Integer</code> or&#160;<code>Long</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong><code>Long</code></strong> is used if: <strong><code>value &gt;</code></strong> <strong><code>Integer.MAX_VALUE</code></strong></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>ulong</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>Long</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>ushort</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>Short</code> or&#160;<code>Integer</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong><code>Integer</code></strong> is used if:&#160;<strong><code>value &gt;</code></strong> <strong><code>Short.MAX_VALUE</code></strong></p></td></tr></tbody></table></div><h4 id="AMQP-HowaAMQPMessagesBodyisMappedtoaJMSMessage">How a AMQP Messages Body is Mapped to a JMS Message</h4><p>If the transformer is set to <strong><code>jms</code></strong> then the JMS message type will depend on the body type of the AMQP message.</p><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>Body Type</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>JMS Message Type</p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>AmqpSequence</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>StreamMessage</code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>AmqpValue</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>ObjectMessage</code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>AmqpValue</code> holding a&#160;<code>null</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>Message</code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>AmqpValue</code> holding a&#160;<code>String</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>TextMessage</code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>AmqpValue</code> holding a&#160;<code>binary</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>BytesMessage</code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>AmqpValue</code> holding a&#160;<code>list</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>StreamMessage</code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>Data</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>BytesMessage</code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>Message</code></p></td></tr></tbody></table></div><h3 id="AMQP-AMQP1.0clientlibrary">AMQP 1.0 client library</h3><p>You can use <a shape="rect" class="external-link" href="http://qpid.apache.org/proton/">Apache Qpid Proton</a>.</p></div>