...
Maven users will need to add the following dependency to their pom.xml
for this component:
Code Block |
|
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-mina2</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
|
URI format
Code Block |
mina2:tcp://hostname[:port][?options]
mina2:udp://hostname[:port][?options]
mina2:vm://hostname[:port][?options]
|
...
div |
class |
confluenceTableSmall |
|
Option |
Default Value |
Description |
codec |
null |
You can refer to a named ProtocolCodecFactory instance in your Registry such as your Spring ApplicationContext , which is then used for the marshalling. |
disconnect |
false |
Whether or not to disconnect(close) from Mina session right after use. Can be used for both consumer and producer. |
textline |
false |
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. |
textlineDelimiter |
DEFAULT |
Only used for TCP and if textline=true. Sets the text line delimiter to use. Possible values are: DEFAULT , AUTO , WINDOWS , UNIX or MAC . If none provided, Camel will use DEFAULT . This delimiter is used to mark the end of text. |
sync |
true |
Setting to set endpoint as one-way or request-response. |
lazySessionCreation |
true |
Sessions can be lazily created to avoid exceptions, if the remote server is not up and running when the Camel producer is started. |
timeout |
30000 |
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. The timeout is only used for Mina producer. |
encoding |
JVM Default |
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. |
transferExchange |
false |
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. |
minaLogger |
false |
You can enable the Apache MINA logging filter. Apache MINA uses slf4j logging at INFO level to log all input and output. |
filters |
null |
You can set a list of Mina IoFilters to register. The filters can be specified as a comma-separate list of bean references (e.g. #filterBean1,#filterBean2 ) where each bean must be of type org.apache.mina.common.IoFilter . |
encoderMaxLineLength |
-1 |
Set the textline protocol encoder max line length. By default the default value of Mina itself is used which are Integer.MAX_VALUE . |
decoderMaxLineLength |
-1 |
Set the textline protocol decoder max line length. By default the default value of Mina itself is used which are 1024. |
maximumPoolSize |
16 |
Number of worker threads in the worker pool for TCP and UDP (UDP requires Camel 2.11.3/2.12.2 onwards). |
allowDefaultCodec |
true |
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. |
disconnectOnNoReply |
true |
If sync is enabled then this option dictates MinaConsumer if it should disconnect where there is no reply to send back. |
noReplyLogLevel |
WARN |
If sync is enabled this option dictates MinaConsumer which logging level to use when logging a there is no reply to send back. Values are: FATAL, ERROR, INFO, DEBUG, OFF . |
orderedThreadPoolExecutor |
true |
Whether to use ordered thread pool, to ensure events are processed orderly on the same channel. |
sslContextParameters |
null |
SSL configuration using an org.apache.camel.util.jsse.SSLContextParameters instance. See Using the JSSE Configuration Utility. |
autoStartTls |
true |
Whether to auto start SSL handshake. |
cachedAddress |
true |
Camel 2.14: Whether to create the InetAddress once and reuse. Setting this to false allows to pickup DNS changes in the network. |
|
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 HL7 that has a custom codec.
...
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:
Code Block |
from("mina2: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.
Code Block |
MockEndpoint mock = getMockEndpoint("mock:result");
mock.expectedBodiesReceived("Hello World");
template.sendBody("mina2:tcp://localhost:" + port1 + "?textline=true&sync=false", "Hello World");
assertMockEndpointsSatisfied();
|
...
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.
Code Block |
from("mina2: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.
Code Block |
String response = (String)template.requestBody("mina2:tcp://localhost:" + port2 + "?textline=true&sync=true", "World");
assertEquals("Bye World", response);
|
...
Spring DSL can, of course, also be used for Mina MINA. In the sample below we expose a TCP server on port 5555:
Code Block |
|
<route>
<from uri="mina2: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:
Code Block |
|
public String handleOrder(String payload) {
...
return "Order: OK"
}
|
...
For instance, the example below will close the session after it has written the bye
message back to the client:
Code Block |
|
from("mina2: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(Mina2Constants.MINA_CLOSE_SESSION_WHEN_COMPLETE, true);
}
});
|
...
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 Page |
|