[[mina-component]]
= Mina Component
//THIS FILE IS COPIED: EDIT THE SOURCE FILE:
:page-source: components/camel-mina/src/main/docs/mina-component.adoc
:docTitle: Mina
:artifactId: camel-mina
:description: Socket level networking using TCP or UDP with Apache Mina 2.x.
:since: 2.10
:supportLevel: Stable
:component-header: Both producer and consumer are supported

*Since Camel {since}*

*{component-header}*

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 28 options, which are listed below.



[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
| *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. The value can be one of: TRACE, DEBUG, INFO, WARN, ERROR, OFF | 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 component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *configuration* (advanced) | To use the shared mina configuration. |  | MinaConfiguration
| *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
| *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. The value can be one of: DEFAULT, AUTO, UNIX, WINDOWS, MAC |  | MinaTextLineDelimiter
| *autoStartTls* (security) | Whether to auto start SSL handshake. | true | boolean
| *sslContextParameters* (security) | To configure SSL security. |  | SSLContextParameters
| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | 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. The value can be one of: InOnly, InOut, InOptionalOut |  | 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. The value can be one of: TRACE, DEBUG, INFO, WARN, ERROR, OFF | 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. The value can be one of: DEFAULT, AUTO, UNIX, WINDOWS, MAC |  | MinaTextLineDelimiter
| *autoStartTls* (security) | Whether to auto start SSL handshake. | true | boolean
| *sslContextParameters* (security) | To configure SSL security. |  | SSLContextParameters
|===
// endpoint 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:dataformats: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`.


include::camel-spring-boot::page$mina-starter.adoc[]
