Hallo zusammen,
ich verwende NIO.2 unter Java 7 und habe den folgenden Code. Das Erstellen des Server Channels findet in einer anderen Methode statt als das anschließende Schließen und ist auch zeitlich getrennt.
Aber immer, wenn ich den Channel schließen und die ChannelGroup beenden will, wird eine Exception innerhalb einer der NIO.2 eigenen Threads geworfen und in der Konsole (bzw. System.err) ausgegeben:
Ich habe die ganze Dokumentation rauf und runter gelesen, aber bisher keinen Weg gefunden, die Sache so zu beenden, dass es keine Exception gibt.
Hat jemand von Euch da eine Idee?
Ich kann die Exception nicht einmal abfangen und statt dessen regulär bspw. über Apache Commons Logging ausgeben, da sie innerhalb von NIO.2 auftritt und nicht nach außen "gemeldet" wird.
ich verwende NIO.2 unter Java 7 und habe den folgenden Code. Das Erstellen des Server Channels findet in einer anderen Methode statt als das anschließende Schließen und ist auch zeitlich getrennt.
Java:
/** The termination timeout in milliseconds of the channel group. */
private static final int CHANNEL_GROUP_TERMINATION_TIMEOUT = 10000;
[...]
ThreadFactory threadFactory;
ExecutorService executorService;
AsynchronousChannelGroup channelGroup;
AsynchronousServerSocketChannel serverChannel;
[...]
executorService = Executors.newCachedThreadPool(threadFactory);
channelGroup = AsynchronousChannelGroup.withThreadPool(executorService);
serverChannel = AsynchronousServerSocketChannel.open(channelGroup);
serverChannel.bind(localSocketAddress);
serverChannel.accept(this, new ConnectionAcceptHandler());
[...]
channel.close();
channelGroup.shutdown();
channelGroup.awaitTermination(CHANNEL_GROUP_TERMINATION_TIMEOUT, TimeUnit.MILLISECONDS);
[...]
Code:
Exception in thread "Thread-0" java.nio.channels.ShutdownChannelGroupException
at sun.nio.ch.Invoker.invokeIndirectly(Invoker.java:222)
at sun.nio.ch.Invoker.invokeIndirectly(Invoker.java:313)
at sun.nio.ch.WindowsAsynchronousServerSocketChannelImpl$AcceptTask.failed(WindowsAsynchronousServerSocketChannelImpl.java:286)
at sun.nio.ch.Iocp$EventHandlerTask.run(Iocp.java:399)
at java.lang.Thread.run(Thread.java:745)
Ich habe die ganze Dokumentation rauf und runter gelesen, aber bisher keinen Weg gefunden, die Sache so zu beenden, dass es keine Exception gibt.
Hat jemand von Euch da eine Idee?
Ich kann die Exception nicht einmal abfangen und statt dessen regulär bspw. über Apache Commons Logging ausgeben, da sie innerhalb von NIO.2 auftritt und nicht nach außen "gemeldet" wird.