2017-11-05 1 views
0

In Netty, wie mache ich einen synchronen Client aufrufen und ein Ergebnis zurückgeben? Hier ist, wie es in Apache-Komponenten funktioniert:In Netty, Wie führe ich einen synchronen Clientanruf und gebe ein Ergebnis zurück? (wie Apache-Komponenten)

HttpResponse response = httpRequester.execute(); 

Ich mag das, ich möchte das in Netty tun.

Ich versuche so etwas, aber wie stelle ich die 'callable' Rückkehr ein?

ChannelFuture f = ctx.writeAndFlush(msg); 
f.awaitUninterruptibly(); 
HttpContent ans = (HttpContent) f.get(); 

Scheint wie das ist der falsche Weg - Sackgasse. Hilfe/Anleitung bitte?

Antwort

0

Der korrekte Weg wäre separate ThreadPoolExecutor für blockierende Operationen zu verwenden. Zum Beispiel:

blockingIOProcessor.execute(() -> { 
      try { 
       HttpContent ans = (HttpContent) f.get(); 
       ctx.writeAndFlush(ans); 
      } catch (Exception e) { 
       ctx.writeAndFlush("Error during blocking operation."); 
      } 
     }); 

Wo blockingIOProcessor die Instanz von ThreadPoolExecutor ist. In dem obigen Code übergeben Sie blockierende Operation, um Thread mit Pipelinekontext zu trennen. Wenn der Blockiervorgang abgeschlossen ist, senden Sie die Antwort über den Kontext an die aufrufende Pipeline zurück, und Ihr Client empfängt das Anforderungsergebnis.

In diesem Fall blockieren Sie nicht netty EventLoops.

+0

Oder verwenden Sie einfach die blockierende (alte IO) Kanalfabrik. – Nicholas

Verwandte Themen