...
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-netty</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
|
...
The URI scheme for a netty component is as follows
Code Block |
---|
netty:tcp://localhost:99999[?options]
netty:udp://remotehost:99999/[?options]
|
...
- listen on a specified socket using either TCP or UDP protocols (with optional SSL support),
- receive requests on the socket using text/xml, binary and serialized object based payloads and
- send them along on a route as message exchanges.
...
- ,
- receive requests on the socket using text/xml, binary and serialized object based payloads and
- send them along on a route as message exchanges.
The consumer mode supports both one-way and request-response based operations.
The following headers are filled for the exchanges created by the Netty consumer:
Div |
---|
class | confluenceTableSmall |
---|
|
Header key | Class | Description |
---|
NettyConstants.NETTY_CHANNEL_HANDLER_CONTEXT / CamelNettyChannelHandlerContext
| org.jboss.netty.channel.ChannelHandlerContext | ChannelHandlerContext instance associated with the connection received by netty.
| NettyConstants.NETTY_MESSAGE_EVENT / CamelNettyMessageEvent
| org.jboss.netty.channel.MessageEvent | MessageEvent instance associated with the connection received by netty.
| NettyConstants.NETTY_REMOTE_ADDRESS / CamelNettyRemoteAddress | java.net.SocketAddress | Remote address of the incoming socket connection. | NettyConstants.NETTY_LOCAL_ADDRESS / CamelNettyLocalAddress | java.net.SocketAddress | Local address of the incoming socket connection. |
|
Usage Samples
A UDP Netty endpoint using Request-Reply and serialized object payload
Code Block |
---|
RouteBuilder builder = new RouteBuilder() {
public void configure() {
from("netty:udp://localhost:5155?sync=true")
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
Poetry poetry = (Poetry) exchange.getIn().getBody();
poetry.setPoet("Dr. Sarojini Naidu");
exchange.getOut().setBody(poetry);
}
}
}
};
|
A TCP based Netty consumer endpoint using One-way communication
Code Block |
---|
RouteBuilder builder = new RouteBuilder() {
public void configure() {
from("netty:tcp://localhost:5150")
.to("mock:result");
}
};
|
...
Programmatic configuration of the component
Code Block |
---|
KeyStoreParameters ksp = new KeyStoreParameters();
ksp.setResource("/users/home/server/keystore.jks");
ksp.setPassword("keystorePassword");
KeyManagersParameters kmp = new KeyManagersParameters();
kmp.setKeyStore(ksp);
kmp.setKeyPassword("keyPassword");
SSLContextParameters scp = new SSLContextParameters();
scp.setKeyManagers(kmp);
NettyComponent nettyComponent = getContext().getComponent("netty", NettyComponent.class);
nettyComponent.setSslContextParameters(scp);
|
Spring DSL based configuration of endpoint
Code Block |
---|
|
...
<camel:sslContextParameters
id="sslContextParameters">
<camel:keyManagers
keyPassword="keyPassword">
<camel:keyStore
resource="/users/home/server/keystore.jks"
password="keystorePassword"/>
</camel:keyManagers>
</camel:sslContextParameters>...
...
<to uri="netty:tcp://localhost:5150?sync=true&ssl=true&sslContextParameters=#sslContextParameters"/>
...
|
Using Basic SSL/TLS configuration on the Jetty Component
Code Block |
---|
JndiRegistry registry = new JndiRegistry(createJndiContext());
registry.bind("password", "changeit");
registry.bind("ksf", new File("src/test/resources/keystore.jks"));
registry.bind("tsf", new File("src/test/resources/keystore.jks"));
context.createRegistry(registry);
context.addRoutes(new RouteBuilder() {
public void configure() {
String netty_ssl_endpoint =
"netty:tcp://localhost:5150?sync=true&ssl=true&passphrase=#password"
+ "&keyStoreFile=#ksf&trustStoreFile=#tsf";
String return_string =
"When You Go Home, Tell Them Of Us And Say,"
+ "For Your Tomorrow, We Gave Our Today.";
from(netty_ssl_endpoint)
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
exchange.getOut().setBody(return_string);
}
}
}
});
|
...
You can get access to the javax.net.ssl.SSLSession
if you eg need to get details about the client certificate. When ssl=true
then the Netty component will store the SSLSession
as a header on the Camel Message as shown below:
Code Block |
---|
SSLSession session = exchange.getIn().getHeader(NettyConstants.NETTY_SSL_SESSION, SSLSession.class);
// get the first certificate which is client certificate
javax.security.cert.X509Certificate cert = session.getPeerCertificateChain()[0];
Principal principal = cert.getSubjectDN();
|
...
However you can also instruct Camel on a per message basis as follows.
To instruct Camel to close the channel, you should add a header with the key CamelNettyCloseChannelWhenComplete
set to a boolean true
value.
For instance, the example below will close the channel after it has written the bye message back to the client:
Code Block |
---|
from("netty:tcp://localhost:8080").process(new Processor() {
public void process(Exchange exchange) throws Exception {
String body = exchange.getIn().getBody(String.class);
exchange.getOut().setBody("Bye " + body);
// some condition which determines if we should close
if (close) {
exchange.getOut().setHeader(NettyConstants.NETTY_CLOSE_CHANNEL_WHEN_COMPLETE, true);
}
}
});
|
...
Code Block |
---|
title | Using custom pipeline factory |
---|
|
public class SampleServerChannelPipelineFactory extends ServerPipelineFactory {
private int maxLineSize = 1024;
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline channelPipeline = Channels.pipeline();
channelPipeline.addLast("encoder-SD", new StringEncoder(CharsetUtil.UTF_8));
channelPipeline.addLast("decoder-DELIM", new DelimiterBasedFrameDecoder(maxLineSize, true, Delimiters.lineDelimiter()));
channelPipeline.addLast("decoder-SD", new StringDecoder(CharsetUtil.UTF_8));
// here we add the default Camel ServerChannelHandler for the consumer, to allow Camel to route the message etc.
channelPipeline.addLast("handler", new ServerChannelHandler(consumer));
return channelPipeline;
}
}
|
The custom channel pipeline factory can then be added to the registry and instantiated/utilized on a camel route in the following way
Code Block |
---|
Registry registry = camelContext.getRegistry();
serverPipelineFactory = new TestServerChannelPipelineFactory();
registry.bind("spf", serverPipelineFactory);
context.addRoutes(new RouteBuilder() {
public void configure() {
String netty_ssl_endpoint =
"netty:tcp://localhost:5150?serverPipelineFactory=#spf"
String return_string =
"When You Go Home, Tell Them Of Us And Say,"
+ "For Your Tomorrow, We Gave Our Today.";
from(netty_ssl_endpoint)
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
exchange.getOut().setBody(return_string);
}
}
}
});
|
...
For example using Spring XML we can create a shared worker thread pool using the NettyWorkerPoolBuilder
with 2 worker threads as shown below:
Code Block |
---|
|
<!-- use the worker pool builder to create to help create the shared thread pool -->
<bean id="poolBuilder" class="org.apache.camel.component.netty.NettyWorkerPoolBuilder">
<property name="workerCount" value="2"/>
</bean>
<!-- the shared worker thread pool -->
<bean id="sharedPool" class="org.jboss.netty.channel.socket.nio.WorkerPool"
factory-bean="poolBuilder" factory-method="build" destroy-method="shutdown">
</bean>
|
...
Then in the Camel routes we can refer to this worker pools by configuring the workerPool
option in the URI as shown below:
Code Block |
---|
|
<route>
<from uri="netty:tcp://localhost:5021?textline=true&sync=true&workerPool=#sharedPool&orderedThreadPoolExecutor=false"/>
<to uri="log:result"/>
...
</route>
|
And if we have another route we can refer to the shared worker pool:
Code Block |
---|
|
<route>
<from uri="netty:tcp://localhost:5022?textline=true&sync=true&workerPool=#sharedPool&orderedThreadPoolExecutor=false"/>
<to uri="log:result"/>
...
</route>
|
... and so forth.
Include Page |
---|
| Endpoint See Also |
---|
| Endpoint See Also |
---|
|