Threads werden auf dem Netty UDP-Server nicht gleichzeitig ausgeführt

Der von mir analysierte Code erstellt einen UDP-Server mit Netty NioDatagramChannelFactory. Es erstellt einen Thread-Pool mit:

<code>ExecutorService threadPool = Executors.newCachedThreadPool();
</code>

Dann der Datagrammkanal, pipelineFactory & bootstrap:

<code>int workerCount = 10;
DatagramChannelFactory datagramChannelFactory = new NioDatagramChannelFactory(threadPool, workerCount);
ChannelPipelineFactory pipelineFactory = new SNMPTrapsPipeLineFactory();

ConnectionlessBootstrap bootStrap = new ConnectionlessBootstrap(datagramChannelFactory);
bootStrap.setPipelineFactory(pipelineFactory);
bootStrap.bind(new InetSocketAddress(host, port));
</code>

In der pipelineFactory fügt getPipeline () die benutzerdefinierten Handler hinzu.

So wie es heißt in:Multithread-Behandlung von UDP-Nachrichten

Es gibt nur einen Thread, der die empfangenen Nachrichten verarbeitet. In den Protokollen wird der Threadname als angezeigtNeuer E / A-Datagramm-Worker Nr. 1 mögen:

2012-04-20 09: 20: 51,853 Neuer E / A-Datagramm-Worker # 1 '-' 1 INFO [c.e.m.s.h.SNMPTrapsRequestHandler: 42] messageReceived | Verarbeitung: V1TRAP [reqestID = 0, ...]

Ich habe die Dokumentation und diesen Eintrag gelesen:Viele UDP-Anfragen sind auf dem UDP-Server mit Netty verloren gegangen

Und dann habe ich den Code ein bisschen nach diesen Einträgen geändert. Nun wird der Threadpool erstellt mit:

<code>int corePoolSize = 5;
ExecutorService threadPool = new OrderedMemoryAwareThreadPoolExecutor(corePoolSize, 1048576, 1048576);
</code>

Und die pipelineFactory mit und ExecutionHandler:

<code>ExecutionHandler executionHandler = new ExecutionHandler(threadPool);
ChannelPipelineFactory pipelineFactory = new SNMPTrapsPipeLineFactory(executionHandler);
</code>

Und die getPipeline () fügt den Handler wie beschrieben hinzu:

<code>public class SNMPTrapsPipeLineFactory implements ChannelPipelineFactory {

    private ExecutionHandler executionHandler = null;

    public SNMPTrapsPipeLineFactory(ExecutionHandler executionHandler) { 
        this.executionHandler = executionHandler;
    }

    @Override
    public ChannelPipeline getPipeline() throws Exception {

        ChannelPipeline pipeline = Channels.pipeline();
        pipeline.addFirst("ExecutorHandler", executionHandler);

        // Here the custom handlers are added
        pipeline.addLast( ... )
    }
</code>

Jetzt bekomme ich 4 verschiedene Threadnamen in den Logs. Sie erscheinen alsPool-2-Thread-1, Pool-2-Thread-2, usw...

Zum Beispiel:

2012-05-09 09: 12: 19,589 pool-2-thread-1 INFO [c.e.m.r.s.h.SNMPTrapsRequestHandler: 46] messageReceived | Verarbeitung: V1TRAP [reqestID = 0, ...]

Sie werden jedoch nicht gleichzeitig verarbeitet. Die Verarbeitung unter messageReceived () muss auf einem Thread für den nächsten beendet werden, um die nächste Nachricht zu verarbeiten. Ich habe ein Buch mit Nachrichten von verschiedenen Clients an den Server gesendet, und die Protokolle, die ich erhalte, sind nicht interlaced. Ich habe auch versucht, Thread.sleep () in messageReceived () und bestätigt die vorherige.

Vermisse ich etwas? Gibt es eine Möglichkeit, mit Netty einen REAL-Multithread-UDP-Server zu erstellen? Wie kann ich verschiedene Threads dazu bringen, messageReceived () gleichzeitig auszuführen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage