2016-04-25 11 views
0

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?

Antwort

0

Es ist Thread-sicher, aber Sie können Ausnahmen in der Pipeline und auf der Client-Seite auslösen, wenn eine Anfrage im Flug ist.

+0

danke Nicholas, – Walter

+0

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

+1

Sie könnten in Betracht ziehen, einen Leerlauf-Handler zu verwenden, um das zu schließen. – Nicholas