Pipeline Netty diferente por datagrama UDP
Temos um servidor que já está implementado no TCP / IP, mas agora temos um requisito para o protocolo suportar também o UDP.
Cada datagrama UDP enviado contém tudo o que preciso para decodificar, por isso é um sistema de resposta e resposta muito simples, com dados no datagrama separados por quebras de linha.
O código para o bootstrap quando o servidor é iniciado é mostrado abaixo:
<code> //SETUP UDP SERVER DatagramChannelFactory udpFactory = new NioDatagramChannelFactory(Executors.newCachedThreadPool()); ConnectionlessBootstrap udpBootstrap = new ConnectionlessBootstrap(udpFactory); udpBootstrap.setOption("sendBufferSize", 65536); udpBootstrap.setOption("receiveBufferSize", 65536); udpBootstrap.setOption("receiveBufferSizePredictorFactory", new AdaptiveReceiveBufferSizePredictorFactory()); udpBootstrap.setOption("broadcast", "true"); udpBootstrap.setPipelineFactory(new ServerPipeLineFactoryUDP()); udpBootstrap.bind(new InetSocketAddress(hostIp, 4000)); </code>
O código do pipeline é:
<code>class ServerPipeLineFactoryUDP implements ChannelPipelineFactory { private final static ExecutionHandler EXECUTION_HANDLER = new ExecutionHandler(new OrderedMemoryAwareThreadPoolExecutor(ScorpionFMS.THREAD_POOL_COUNT, 0, 0)); public ServerPipeLineFactoryUDP() { } @Override public ChannelPipeline getPipeline() throws Exception { ChannelPipeline pipeline = pipeline(); pipeline.addLast("debugup", new DebugUpstreamHandler("UDP")); pipeline.addLast("debugdown", new DebugDownstreamHandler("UDP")); pipeline.addLast("framer", new DelimiterBasedFrameDecoder(256, Delimiters.lineDelimiter())); pipeline.addLast("decoder", new UDPRequestDecoder(true)); pipeline.addLast("encoder", new StringEncoder()); pipeline.addLast("executor", EXECUTION_HANDLER); pipeline.addLast("handler", new UDPRequestHandler( return pipeline; } } </code>
O problema que estou tendo é cada datagrama está usando a mesma instância deste pipeline (eu esperava que cada datagrama usaria uma nova instância do pipeline), então todo o estado que eu armazeno enquanto processo o conteúdo de um datagrama é salvo e o próximo datagrama usa também, (enquanto que para TCP cada conexão teria seu próprio canal e, portanto, sua própria instância do pipeline e seu próprio estado)
Eu sei que este é o comportamento esperado de ler a documentação, mas existe de qualquer maneira para forçar netty para recriar o pipeline para cada datagrama? Ou eu estou indo sobre isso completamente errado?
De forma sucinta, quero que cada datagrama tenha uma nova instância do pipeline (o mesmo que tcp)