36.9. 自定义管道
自定义频道管道通过插入自定义处理器、编码程序和解码器,为用户提供对处理程序/中断链的完整控制,而无需以非常简单的方式在 Netty Endpoint URL 中指定它们。
要添加自定义管道,必须创建一个自定义频道管道工厂,并通过上下文 registry (Registry)或 camel-spring ApplicationContextRegistry 等上下文注册。
必须构建自定义管道工厂,如下所示
-
Producer 链接频道管道工厂必须扩展抽象类
ClientPipelineFactory
。 -
Consumer linked 频道管道工厂必须扩展抽象类
ServerInitializerFactory
。 -
类应覆盖 initChannel ()方法,以插入自定义处理程序、编码器和解码器。不覆盖
initChannel ()
方法会创建一个没有处理程序、编码器或解码器到管道的管道。
以下示例显示了如何创建 ServerInitializerFactory factory
36.9.1. 使用自定义管道工厂
public class SampleServerInitializerFactory extends ServerInitializerFactory { private int maxLineSize = 1024; protected void initChannel(Channel ch) throws Exception { ChannelPipeline channelPipeline = ch.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)); } }
然后,可以通过以下方法将自定义频道管道工厂添加到 registry 中,并在 camel 路由上实例化/使用
Registry registry = camelContext.getRegistry(); ServerInitializerFactory factory = new TestServerInitializerFactory(); registry.bind("spf", factory); context.addRoutes(new RouteBuilder() { public void configure() { String netty_ssl_endpoint = "netty:tcp://0.0.0.0:5150?serverInitializerFactory=#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); } } } });