Input/Output NIO.2: ShutdownChannelGroupException vermeiden

Grizzly

Top Contributor
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.
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);

[...]
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:
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.
 

Grizzly

Top Contributor
Okay, über Thread.setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) wäre es möglich, die Ausgabe nach System.err abzufangen. Irgendwie aber eine suboptimale Lösung. :(

Falls jemand eine bessere / richtige Lösung hätte (sprich wie man die Exception generell vermeiden kann), wäre ich sehr dankbar. :)
 

Ähnliche Java Themen

Neue Themen


Oben