= AWS MQ Component
:doctitle: AWS MQ
:shortname: aws2-mq
:artifactid: camel-aws2-mq
:description: Manage AWS MQ instances using AWS SDK version 2.x.
:since: 3.1
:supportlevel: Stable
:component-header: Only producer is supported
//Manually maintained attributes
:group: AWS
:camel-spring-boot-name: aws2-mq

*Since Camel {since}*

*{component-header}*

The AWS2 MQ component supports create, run, start, stop and terminate
https://aws.amazon.com/amazon-mq/[AWS MQ] instances.

Prerequisites

You must have a valid Amazon Web Services developer account, and be
signed up to use Amazon MQ. More information is available at
https://aws.amazon.com/amazon-mq/[Amazon MQ].

== URI Format

-------------------------
aws2-mq://label[?options]
-------------------------

You can append query options to the URI in the following format,
?options=value&option2=value&...

// component-configure options: START

// component-configure options: END

// component options: START
include::partial$component-configure-options.adoc[]
include::partial$component-endpoint-options.adoc[]
// component options: END

// endpoint options: START

// endpoint options: END


Required MQ component options

You have to provide the amazonMqClient in the
Registry or your accessKey and secretKey to access
the https://aws.amazon.com/amazon-mq/[Amazon MQ] service.

== Usage

=== Static credentials vs Default Credential Provider

You have the possibility of avoiding the usage of explicit static credentials, by specifying the useDefaultCredentialsProvider option and set it to true.

 - Java system properties - aws.accessKeyId and aws.secretKey
 - Environment variables - AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY.
 - Web Identity Token from AWS STS.
 - The shared credentials and config files.
 - Amazon ECS container credentials - loaded from the Amazon ECS if the environment variable AWS_CONTAINER_CREDENTIALS_RELATIVE_URI is set.
 - Amazon EC2 Instance profile credentials. 

For more information about this you can look at https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/credentials.html[AWS credentials documentation]

=== Message headers evaluated by the MQ producer

[width="100%",cols="10%,10%,80%",options="header",]
|=======================================================================
|Header |Type |Description

|`CamelAwsMQMaxResults` |`String` |The number of results that must be retrieved from listBrokers operation

|`CamelAwsMQBrokerName` |`String` |The broker name

|`CamelAwsMQOperation` |`String` |The operation we want to perform

|`CamelAwsMQBrokerId` |`String` |The broker id

|`CamelAwsMQBrokerDeploymentMode` |`String` |The deployment mode for the broker in the createBroker operation

|`CamelAwsMQBrokerInstanceType` |`String` |The instance type for the MQ machine in the createBroker operation

|`CamelAwsMQBrokerEngine` |`String` |The Broker Engine for MQ. Default is ACTIVEMQ

|`CamelAwsMQBrokerEngineVersion` |`String` |The Broker Engine Version for MQ. Currently you can choose between 5.15.6 and 5.15.0 of ACTIVEMQ

|`CamelAwsMQBrokerUsers` |`List<User>` |The list of users for MQ

|`CamelAwsMQBrokerPubliclyAccessible` |`Boolean` |If the MQ instance must be publicly available or not. Default is false.
|=======================================================================

=== MQ Producer operations

Camel-AWS MQ component provides the following operation on the producer side:

- listBrokers
- createBroker
- deleteBroker
- rebootBroker
- updateBroker
- describeBroker

== Examples

=== Producer Examples

- listBrokers: this operation will list the available MQ Brokers in AWS

[source,java]
--------------------------------------------------------------------------------
from("direct:listBrokers")
    .to("aws2-mq://test?amazonMqClient=#amazonMqClient&operation=listBrokers")
--------------------------------------------------------------------------------

- createBroker: this operation will create an MQ Broker in AWS

[source,java]
--------------------------------------------------------------------------------
from("direct:createBroker")
    .process(new Processor() {
       @Override
       public void process(Exchange exchange) throws Exception {
                exchange.getIn().setHeader(MQ2Constants.BROKER_NAME, "test");
                exchange.getIn().setHeader(MQ2Constants.BROKER_DEPLOYMENT_MODE, DeploymentMode.SINGLE_INSTANCE);
                exchange.getIn().setHeader(MQ2Constants.BROKER_INSTANCE_TYPE, "mq.t2.micro");
                exchange.getIn().setHeader(MQ2Constants.BROKER_ENGINE, EngineType.ACTIVEMQ.name());
                exchange.getIn().setHeader(MQ2Constants.BROKER_ENGINE_VERSION, "5.15.6");
                exchange.getIn().setHeader(MQ2Constants.BROKER_PUBLICLY_ACCESSIBLE, false);
                List<User> users = new ArrayList<>();
                User.Builder user = User.builder();
                user.username("camel");
                user.password("camelpwd");
                users.add(user.build());
                exchange.getIn().setHeader(MQ2Constants.BROKER_USERS, users);
						
       }
    })
    .to("aws2-mq://test?amazonMqClient=#amazonMqClient&operation=createBroker")
--------------------------------------------------------------------------------

- deleteBroker: this operation will delete an MQ Broker in AWS

[source,java]
--------------------------------------------------------------------------------
from("direct:listBrokers")
    .setHeader(MQ2Constants.BROKER_ID, constant("123")
    .to("aws2-mq://test?amazonMqClient=#amazonMqClient&operation=deleteBroker")
--------------------------------------------------------------------------------

- rebootBroker: this operation will delete an MQ Broker in AWS

[source,java]
--------------------------------------------------------------------------------
from("direct:listBrokers")
    .setHeader(MQ2Constants.BROKER_ID, constant("123")
    .to("aws2-mq://test?amazonMqClient=#amazonMqClient&operation=rebootBroker")
--------------------------------------------------------------------------------

== Using a POJO as body

Sometimes build an AWS Request can be complex, because of multiple options. We introduce the possibility to use a POJO as body.
In AWS MQ there are multiple operations you can submit, as an example for List brokers request, you can do something like:

[source,java]
------------------------------------------------------------------------------------------------------
from("direct:aws2-mq")
     .setBody(ListBrokersRequest.builder().maxResults(10).build())
     .to("aws2-mq://test?amazonMqClient=#amazonMqClient&operation=listBrokers&pojoRequest=true")
------------------------------------------------------------------------------------------------------

In this way you'll pass the request directly without the need of passing headers and options specifically related to this operation.

== Dependencies

Maven users will need to add the following dependency to their pom.xml.

*pom.xml*

[source,xml]
---------------------------------------
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-aws2-mq</artifactId>
    <version>${camel-version}</version>
</dependency>
---------------------------------------

where `$\{camel-version}` must be replaced by the actual version of Camel.


include::spring-boot:partial$starter.adoc[]
