[[mina-component]]
= Mina Component
:page-source: components/camel-mina/src/main/docs/mina-component.adoc

*Since Camel 2.10*

// HEADER START
*Both producer and consumer is supported*
// HEADER END

The Mina component is a transport for working with
http://mina.apache.org/[Apache MINA 2.x]

TIP: Favor using xref:netty-component.adoc[Netty] as Netty is a much more active
maintained and popular project than Apache Mina currently is.

WARNING: Be careful with `sync=false` on consumer endpoints. Since camel-mina all
consumer exchanges are InOut. This is different to camel-mina.

Maven users will need to add the following dependency to their `pom.xml`
for this component:

[source,xml]
------------------------------------------------------------
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-mina</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
------------------------------------------------------------

== URI format

[source,java]
-------------------------------------
mina:tcp://hostname[:port][?options]
mina:udp://hostname[:port][?options]
mina:vm://hostname[:port][?options]
-------------------------------------

You can specify a codec in the Registry using the
*codec* option. If you are using TCP and no codec is specified then the
`textline` flag is used to determine if text line based codec or object
serialization should be used instead. By default the object
serialization is used.

For UDP if no codec is specified the default uses a basic `ByteBuffer`
based codec.

The VM protocol is used as a direct forwarding mechanism in the same
JVM.

A Mina producer has a default timeout value of 30 seconds, while it
waits for a response from the remote server.

In normal use, `camel-mina` only supports marshalling the body
content—message headers and exchange properties are not sent. +
 However, the option, *transferExchange*, does allow you to transfer the
exchange itself over the wire. See options below.

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

== Options





// component options: START
The Mina component supports 5 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *configuration* (advanced) | To use the shared mina configuration. |  | MinaConfiguration
| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
|===
// component options: END








// endpoint options: START
The Mina endpoint is configured using URI syntax:

----
mina:protocol:host:port
----

with the following path and query parameters:

=== Path Parameters (3 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *protocol* | *Required* Protocol to use |  | String
| *host* | *Required* Hostname to use. Use localhost or 0.0.0.0 for local server as consumer. For producer use the hostname or ip address of the remote server. |  | String
| *port* | *Required* Port number |  | int
|===


=== Query Parameters (29 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *disconnect* (common) | Whether or not to disconnect(close) from Mina session right after use. Can be used for both consumer and producer. | false | boolean
| *minaLogger* (common) | You can enable the Apache MINA logging filter. Apache MINA uses slf4j logging at INFO level to log all input and output. | false | boolean
| *sync* (common) | Setting to set endpoint as one-way or request-response. | true | boolean
| *timeout* (common) | You can configure the timeout that specifies how long to wait for a response from a remote server. The timeout unit is in milliseconds, so 60000 is 60 seconds. | 30000 | long
| *writeTimeout* (common) | Maximum amount of time it should take to send data to the MINA session. Default is 10000 milliseconds. | 10000 | long
| *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
| *clientMode* (consumer) | If the clientMode is true, mina consumer will connect the address as a TCP client. | false | boolean
| *disconnectOnNoReply* (consumer) | If sync is enabled then this option dictates MinaConsumer if it should disconnect where there is no reply to send back. | true | boolean
| *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
| *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
| *noReplyLogLevel* (consumer) | If sync is enabled this option dictates MinaConsumer which logging level to use when logging a there is no reply to send back. | WARN | LoggingLevel
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *cachedAddress* (producer) | Whether to create the InetAddress once and reuse. Setting this to false allows to pickup DNS changes in the network. | true | boolean
| *lazySessionCreation* (producer) | Sessions can be lazily created to avoid exceptions, if the remote server is not up and running when the Camel producer is started. | true | boolean
| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *maximumPoolSize* (advanced) | Number of worker threads in the worker pool for TCP and UDP | 16 | int
| *orderedThreadPoolExecutor* (advanced) | Whether to use ordered thread pool, to ensure events are processed orderly on the same channel. | true | boolean
| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
| *transferExchange* (advanced) | Only used for TCP. You can transfer the exchange over the wire instead of just the body. The following fields are transferred: In body, Out body, fault body, In headers, Out headers, fault headers, exchange properties, exchange exception. This requires that the objects are serializable. Camel will exclude any non-serializable objects and log it at WARN level. | false | boolean
| *allowDefaultCodec* (codec) | The mina component installs a default codec if both, codec is null and textline is false. Setting allowDefaultCodec to false prevents the mina component from installing a default codec as the first element in the filter chain. This is useful in scenarios where another filter must be the first in the filter chain, like the SSL filter. | true | boolean
| *codec* (codec) | To use a custom minda codec implementation. |  | ProtocolCodecFactory
| *decoderMaxLineLength* (codec) | To set the textline protocol decoder max line length. By default the default value of Mina itself is used which are 1024. | 1024 | int
| *encoderMaxLineLength* (codec) | To set the textline protocol encoder max line length. By default the default value of Mina itself is used which are Integer.MAX_VALUE. | -1 | int
| *encoding* (codec) | You can configure the encoding (a charset name) to use for the TCP textline codec and the UDP protocol. If not provided, Camel will use the JVM default Charset |  | String
| *filters* (codec) | You can set a list of Mina IoFilters to use. |  | List
| *textline* (codec) | Only used for TCP. If no codec is specified, you can use this flag to indicate a text line based codec; if not specified or the value is false, then Object Serialization is assumed over TCP. | false | boolean
| *textlineDelimiter* (codec) | Only used for TCP and if textline=true. Sets the text line delimiter to use. If none provided, Camel will use DEFAULT. This delimiter is used to mark the end of text. |  | MinaTextLineDelimiter
| *autoStartTls* (security) | Whether to auto start SSL handshake. | true | boolean
| *sslContextParameters* (security) | To configure SSL security. |  | SSLContextParameters
|===
// endpoint options: END
// spring-boot-auto-configure options: START
== Spring Boot Auto-Configuration

When using Spring Boot make sure to use the following Maven dependency to have support for auto configuration:

[source,xml]
----
<dependency>
  <groupId>org.apache.camel.springboot</groupId>
  <artifactId>camel-mina-starter</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>
----


The component supports 31 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *camel.component.mina.basic-property-binding* | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | Boolean
| *camel.component.mina.bridge-error-handler* | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | Boolean
| *camel.component.mina.configuration.allow-default-codec* | The mina component installs a default codec if both, codec is null and textline is false. Setting allowDefaultCodec to false prevents the mina component from installing a default codec as the first element in the filter chain. This is useful in scenarios where another filter must be the first in the filter chain, like the SSL filter. | true | Boolean
| *camel.component.mina.configuration.auto-start-tls* | Whether to auto start SSL handshake. | true | Boolean
| *camel.component.mina.configuration.cached-address* | Whether to create the InetAddress once and reuse. Setting this to false allows to pickup DNS changes in the network. | true | Boolean
| *camel.component.mina.configuration.client-mode* | If the clientMode is true, mina consumer will connect the address as a TCP client. | false | Boolean
| *camel.component.mina.configuration.codec* | To use a custom minda codec implementation. |  | ProtocolCodecFactory
| *camel.component.mina.configuration.decoder-max-line-length* | To set the textline protocol decoder max line length. By default the default value of Mina itself is used which are 1024. | 1024 | Integer
| *camel.component.mina.configuration.disconnect* | Whether or not to disconnect(close) from Mina session right after use. Can be used for both consumer and producer. | false | Boolean
| *camel.component.mina.configuration.disconnect-on-no-reply* | If sync is enabled then this option dictates MinaConsumer if it should disconnect where there is no reply to send back. | true | Boolean
| *camel.component.mina.configuration.encoder-max-line-length* | To set the textline protocol encoder max line length. By default the default value of Mina itself is used which are Integer.MAX_VALUE. | -1 | Integer
| *camel.component.mina.configuration.encoding* | You can configure the encoding (a charset name) to use for the TCP textline codec and the UDP protocol. If not provided, Camel will use the JVM default Charset |  | String
| *camel.component.mina.configuration.filters* | You can set a list of Mina IoFilters to use. |  | List
| *camel.component.mina.configuration.host* | Hostname to use. Use localhost or 0.0.0.0 for local server as consumer. For producer use the hostname or ip address of the remote server. |  | String
| *camel.component.mina.configuration.lazy-session-creation* | Sessions can be lazily created to avoid exceptions, if the remote server is not up and running when the Camel producer is started. | true | Boolean
| *camel.component.mina.configuration.maximum-pool-size* | Number of worker threads in the worker pool for TCP and UDP | 16 | Integer
| *camel.component.mina.configuration.mina-logger* | You can enable the Apache MINA logging filter. Apache MINA uses slf4j logging at INFO level to log all input and output. | false | Boolean
| *camel.component.mina.configuration.no-reply-log-level* | If sync is enabled this option dictates MinaConsumer which logging level to use when logging a there is no reply to send back. |  | LoggingLevel
| *camel.component.mina.configuration.ordered-thread-pool-executor* | Whether to use ordered thread pool, to ensure events are processed orderly on the same channel. | true | Boolean
| *camel.component.mina.configuration.port* | Port number |  | Integer
| *camel.component.mina.configuration.protocol* | Protocol to use |  | String
| *camel.component.mina.configuration.ssl-context-parameters* | To configure SSL security. |  | SSLContextParameters
| *camel.component.mina.configuration.sync* | Setting to set endpoint as one-way or request-response. | true | Boolean
| *camel.component.mina.configuration.textline* | Only used for TCP. If no codec is specified, you can use this flag to indicate a text line based codec; if not specified or the value is false, then Object Serialization is assumed over TCP. | false | Boolean
| *camel.component.mina.configuration.textline-delimiter* | Only used for TCP and if textline=true. Sets the text line delimiter to use. If none provided, Camel will use DEFAULT. This delimiter is used to mark the end of text. |  | MinaTextLineDelimiter
| *camel.component.mina.configuration.timeout* | You can configure the timeout that specifies how long to wait for a response from a remote server. The timeout unit is in milliseconds, so 60000 is 60 seconds. | 30000 | Long
| *camel.component.mina.configuration.transfer-exchange* | Only used for TCP. You can transfer the exchange over the wire instead of just the body. The following fields are transferred: In body, Out body, fault body, In headers, Out headers, fault headers, exchange properties, exchange exception. This requires that the objects are serializable. Camel will exclude any non-serializable objects and log it at WARN level. | false | Boolean
| *camel.component.mina.configuration.write-timeout* | Maximum amount of time it should take to send data to the MINA session. Default is 10000 milliseconds. | 10000 | Long
| *camel.component.mina.enabled* | Whether to enable auto configuration of the mina component. This is enabled by default. |  | Boolean
| *camel.component.mina.lazy-start-producer* | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | Boolean
| *camel.component.mina.use-global-ssl-context-parameters* | Enable usage of global SSL context parameters. | false | Boolean
|===
// spring-boot-auto-configure options: END





== Using a custom codec

See the Mina how to write your own codec. To use your custom codec with
`camel-mina`, you should register your codec in the
Registry; for example, by creating a bean in the
Spring XML file. Then use the `codec` option to specify the bean ID of
your codec. See xref:hl7-dataformat.adoc[HL7] that has a custom codec.

=== Sample with sync=false

In this sample, Camel exposes a service that listens for TCP connections
on port 6200. We use the *textline* codec. In our route, we create a
Mina consumer endpoint that listens on port 6200:

[source,java]
---------------------------------------------------------------------------------------
from("mina:tcp://localhost:" + port1 + "?textline=true&sync=false").to("mock:result");
---------------------------------------------------------------------------------------

As the sample is part of a unit test, we test it by sending some data to
it on port 6200.

[source,java]
-------------------------------------------------------------------------------------------------
MockEndpoint mock = getMockEndpoint("mock:result");
mock.expectedBodiesReceived("Hello World");

template.sendBody("mina:tcp://localhost:" + port1 + "?textline=true&sync=false", "Hello World");

assertMockEndpointsSatisfied();
-------------------------------------------------------------------------------------------------

=== Sample with sync=true

In the next sample, we have a more common use case where we expose a TCP
service on port 6201 also use the textline codec. However, this time we
want to return a response, so we set the `sync` option to `true` on the
consumer.

[source,java]
---------------------------------------------------------------------------------------------
from("mina:tcp://localhost:" + port2 + "?textline=true&sync=true").process(new Processor() {
    public void process(Exchange exchange) throws Exception {
        String body = exchange.getIn().getBody(String.class);
        exchange.getOut().setBody("Bye " + body);
    }
});
---------------------------------------------------------------------------------------------

Then we test the sample by sending some data and retrieving the response
using the `template.requestBody()` method. As we know the response is a
`String`, we cast it to `String` and can assert that the response is, in
fact, something we have dynamically set in our processor code logic.

[source,java]
-----------------------------------------------------------------------------------------------------------------------
String response = (String)template.requestBody("mina:tcp://localhost:" + port2 + "?textline=true&sync=true", "World");
assertEquals("Bye World", response);
-----------------------------------------------------------------------------------------------------------------------

== Sample with Spring DSL

Spring DSL can, of course, also be used for xref:mina-component.adoc[MINA]. In the
sample below we expose a TCP server on port 5555:

[source,xml]
-----------------------------------------------------------
   <route>
     <from uri="mina:tcp://localhost:5555?textline=true"/>
     <to uri="bean:myTCPOrderHandler"/>
  </route>
-----------------------------------------------------------

In the route above, we expose a TCP server on port 5555 using the
textline codec. We let the Spring bean with ID, `myTCPOrderHandler`,
handle the request and return a reply. For instance, the handler bean
could be implemented as follows:

[source,java]
-----------------------------------------------
    public String handleOrder(String payload) {
        ...
        return "Order: OK"
   }
-----------------------------------------------

== Closing Session When Complete

When acting as a server you sometimes want to close the session when,
for example, a client conversion is finished. To instruct Camel to close
the session, you should add a header with the key
`CamelMinaCloseSessionWhenComplete` set to a boolean `true` value.

For instance, the example below will close the session after it has
written the `bye` message back to the client:

[source,java]
---------------------------------------------------------------------------------------------------
        from("mina:tcp://localhost:8080?sync=true&textline=true").process(new Processor() {
            public void process(Exchange exchange) throws Exception {
                String body = exchange.getIn().getBody(String.class);
                exchange.getOut().setBody("Bye " + body);
                exchange.getOut().setHeader(MinaConstants.MINA_CLOSE_SESSION_WHEN_COMPLETE, true);
            }
        });
---------------------------------------------------------------------------------------------------

== Get the IoSession for message

You can get the IoSession from the message header with this key
`MinaConstants.MINA_IOSESSION`, and also get the local host address
with the key `MinaConstants.MINA_LOCAL_ADDRESS` and remote host address
with the key `MinaConstants.MINA_REMOTE_ADDRESS`.

== Configuring Mina filters

Filters permit you to use some Mina Filters, such as `SslFilter`. You
can also implement some customized filters. Please note that `codec` and
`logger` are also implemented as Mina filters of type, `IoFilter`. Any
filters you may define are appended to the end of the filter chain; that
is, after `codec` and `logger`.

