240.9. 添加自定义频道管道工厂,以获取对创建的管道的完整控制
从 Camel 2.5 开始提供
自定义频道管道通过插入自定义处理器和解码器,而无需以非常简单的方式在 Netty Endpoint URL 中指定,从而对处理器/中断链为用户提供完全控制。
要添加自定义管道,必须创建一个自定义频道管道工厂,并通过上下文 registry (JNDIRegistry,或 camel-spring ApplicationContextRegistry 等)进行注册。
自定义管道工厂必须构建如下
-
Producer 链接频道管道工厂必须扩展 abstract 类
ClientPipelineFactory。 -
一个 Consumer linked 频道管道工厂必须扩展 abstract 类
ServerPipelineFactory。 - 类应覆盖 getPipeline ()方法,以插入自定义处理程序、编码器和解码器。不覆盖 getPipeline ()方法会创建一个管道,没有处理程序、编码或解码器到管道。
以下示例演示了如何创建 ServerChannel Pipeline 工厂
使用自定义管道工厂
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;
}
}
然后,自定义频道管道工厂可以添加到 registry 中,并使用以下方法在 camel 路由上实例化/使用
Registry registry = camelContext.getRegistry();
serverPipelineFactory = new TestServerChannelPipelineFactory();
registry.bind("spf", serverPipelineFactory);
context.addRoutes(new RouteBuilder() {
public void configure() {
String netty_ssl_endpoint =
"netty:tcp://0.0.0.0: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);
}
}
}
});