Ich habe einen Netty-Server, wo ich Request Channel in einem anderen Thread schließen muss. Ist es threadsicher das zu tun? Wenn nicht, könnte es einen Workaround geben, um es zu lösen? Jeder Vorschlag wird geschätzt!Ist Netty Channel.close() Thread sicher?
BTW, ich benutze netty-4.0.34 mit NioEventLoopGroup.
AbstractChannelHandlerContext.java:514
@Override
public ChannelFuture close(final ChannelPromise promise) {
if (!validatePromise(promise, false)) {
// cancelled
return promise;
}
final AbstractChannelHandlerContext next = findContextOutbound();
EventExecutor executor = next.executor();
if (next.isHandlerAddedCalled() && executor.inEventLoop()) {
next.invokeClose(promise);
} else {
safeExecute(executor, new OneTimeTask() {
@Override
public void run() {
next.invokeClose(promise);
}
}, promise, null);
}
return promise;
}
Wenn in einem anderen Thread aufgerufen, Gewinde der IO, dass der Kanal schließlich hat stecken die Schließung tat, da 'executor.inEventLoop()' wird immer falsch. Ist diese Interpretation richtig?
danke Nicholas, – Walter
In meinem Szenario habe ich einen Timer-Thread mit 'org.quartz-scheduler' gestartet und schließe den Kanal, wenn die Zeit abgelaufen ist. Da der Timer-Thread nicht der IO-Thread in EventLoop ist, habe ich mich gefragt, welcher Thread den Schließprozess letztendlich durchführen wird? – Walter
Sie könnten in Betracht ziehen, einen Leerlauf-Handler zu verwenden, um das zu schließen. – Nicholas