= Anypoint MQ Publish Operation - Mule 4
The Publish operation enables you to create a new Anypoint MQ message and send it to the specified destination: queue, FIFO queue, or message exchange. With it, you can configure both the content of the message and all the headers and properties you need.
== Outgoing Message Structure
Messages contain these parameters:
* `body`
+
Contains the body of the published Anypoint MQ message.
* `properties`
+
Represents a simple key-value map of strings that are the message properties of the message.
== Send a Message
When used in its default form, the connector publishes the content found in the incoming message `payload` as `body` of the Anypoint MQ message, serialized as a string, to the declared `destination`:
image::amq-4x-publish-operation.png[Anypoint MQ Publish Operation]
[source,xml]
----
----
This operation produces the following output:
* A copy of the body sent as payload
+
For example, if you are sending a "Hello world" message, the resulting payload is the "Hello world" string.
* The message `messageId` value in the message attributes
image::amq-4x-publish-attributes.png[Anypoint MQ Publish Operation Output Attributes]
== Configure User Properties
You can define properties for outgoing messages, for example, to provide compatibility with other messaging systems or to communicate the content type of a message.
Anypoint MQ supports strings and numbers in property values.
[IMPORTANT]
include::mq::partial$mq-user-props.adoc[tag=mqNumberPropsConnector]
To configure these properties directly in the message, use the `properties` parameter of the Publish operation and define a key-value map using DataWeave.
For example:
image::amq-4x-publish-properties.png[Anypoint MQ Publish With Properties]
[source,xml,linenums]
----
----
User properties that you define in the Publish operation appear in Anypoint MQ in the *Message Browser* details pane for the message:
.The screen shows (*1*) the *Message Browser* option and (*2*) the *User Properties* in the details pane.
image::amq-4x-publish-user-props.png[User Properties in Message Browser details pane]
=== Transform the Message Body
If the payload is not in the correct format, you can transform it to the correct format.
To transform a payload, declare an inline DataWeave transformation in the `body` parameter of the Publish operation:
image::amq-4x-publish-transformed.png[Anypoint MQ Publish With Transformation]
[source,xml,linenums]
----
----
In this case, the result of the operation is the _transformed_ value as JSON.
== Advanced Configurations
You might want to set a unique custom message ID instead of letting Anypoint MQ generate it. You can also add the content type of the message body as a property.
=== Set a Custom Message ID
Instead of letting Anypoint MQ generate a unique `messageId` value for the new published message, set a custom `messageId` value in the *Message Id* field in the *Advanced* tab:
image::amq-4x-publish-advanced.png[Anypoint MQ Publish Advanced Tab - Message Id]
The ID of an Anypoint MQ message must be unique. Make sure to choose a unique custom ID to avoid unwanted side effects of duplicated IDs.
FIFO queues provide message deduplication. If multiple messages are sent to a FIFO queue containing the same message ID, the first message to arrive is kept as the valid message.
See xref:mq::mq-queues.adoc#fifo-exactly-once-delivery[FIFO Exactly-Once Delivery] for more information.
=== Delay Message Delivery
Anypoint MQ supports the ability to publish a message and postpone making it visible to consumers using the `deliveryDelay` parameter:
. Select the Publish operation.
. Click the *Advanced* tab.
. Set the *Delivery Delay* parameter to the amount of time to delay:
+
image::amq-4x-publish-advanced-delay.png[Anypoint MQ Publish Advanced Tab - Delivery Delay]
+
By default, the `deliveryDelay` parameter is set to `0`, which specifies to deliver messages immediately (no delay). The maximum `deliveryDelay` value is 15 minutes.
+
See xref:mq::mq-glossary.adoc#delay-messages[Delayed Message Delivery] for more information.
+
. Select the unit from the *Delivery Delay Unit* menu.
=== Set a Message Group ID
When using FIFO queues, you can assign a message group ID to an outgoing message using the `messageGroupID` parameter:
. Select the Publish operation.
. Click the *Advanced* tab.
. Enter an ID in the *Message Group ID* field:
+
image::amq-4x-publish-advanced-groupid.png[Anypoint MQ Publish Advanced Tab - Message Group ID]
+
By default, all messages sent to a FIFO queue have the same autogenerated group ID.
+
See xref:mq::mq-queues.adoc#fifo-queues-msg-groups[FIFO Queues and Message Groups] for more information.
To get the maximum value from message groups, define more granular groups with fewer messages in each group.
For example, when processing messages from multiple users, to keep each user's events in relative order, use the value of the user's `userId` as the message group ID.
=== Propagate Content Type
To specify whether the content type of the message body is propagated as a property of the Anypoint MQ message or not, use the `sendContentType` parameter.
Setting this parameter to `true` automatically adds a `contentType` property to the outgoing message. This can be useful to declare that a message body is in `application/json` or `application/xml` format.
== See Also
* xref:anypoint-mq-listener.adoc[]
* xref:mq::mq-glossary.adoc[]
* xref:mq::mq-queues.adoc[]