2016-11-08 3 views
3

Ich verwende Grpc, um zwischen einem Java-Server und Node-Client zu kommunizieren. Wenn einer von ihnen stirbt/stürzt der andere ab.Behandlung von Client- und Server-Fehler auf Grpc Java/Knoten

Hier ist die Ausnahme auf Java Server geworfen, wenn der Knoten Client stirbt -

Nov 08, 2016 11:28:03 AM io.grpc.netty.NettyServerHandler onConnectionError 
WARNING: Connection Error 
java.io.IOException: An existing connection was forcibly closed by the remote host 
    at sun.nio.ch.SocketDispatcher.read0(Native Method) 
    at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43) 
    at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223) 
    at sun.nio.ch.IOUtil.read(IOUtil.java:192) 
    at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380) 
    at io.netty.buffer.PooledUnsafeDirectByteBuf.setBytes(PooledUnsafeDirectByteBuf.java:288) 
    at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1100) 
    at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:349) 
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:112) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:571) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:512) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:426) 
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:398) 
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:877) 
    at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144) 
    at java.lang.Thread.run(Thread.java:745) 

Hier ist die Ausnahme auf dem Knoten ausgelöst wird, wenn Java stirbt:

events.js:141 
     throw er; // Unhandled 'error' event 
    ^
Error: {"created":"@1478623914.082000000","description":"An existing connection was forcibly closed by the remote  host.\r\n","file":"..\src\core\lib\iomgr\tcp_windows.c","file_line":171,"grpc_status":14}  
    at ClientReadableStream._emitStatusIfDone ( C:\HarshalDev\Live_TDFX\TDSL0007-TDFXPlatfo rmsDesignandBuild\tdfxlive\node_modules\grpc\src\node\src\client.js:189:19) 
    at ClientReadableStream._receiveStatus (C:\ HarshalDev\Live_TDFX\TDSL0007-TDFXPlatformsDesignandBuild\tdfxlive\node_modules\grpc\src\node\src\client.js:169:8) 
    at C:\HarshalDev\Live_TDFX\TDSL0007-TDFXPlatformsDesignandBuild\tdfxlive\node_modules\grpc\src\node\src\client.js:577:14 
[nodemon] app crashed - waiting for file changes before starting... 

FRAGE - Wie gehe ich mit dieser Ausnahmen ?

Ich habe versucht, ohne Erfolg Versuch/catch und Hinzufügen einer nicht abgefangenen Ausnahmehandler für Threads.

Java-Code zu initialisieren -

ServerBuilder<?> serverBuilder = ServerBuilder.forPort(getPort()); 
server = serverBuilder 
     .addService(createBwayStreamingService()) 
     .addService(ServerInterceptors.intercept(createBwayOrderService(), authServerInterceptor)) 
     .addService(createBwayInstrumentService()) 
     .addService(createBwaySettlementService()) 
     .addService(createBwayDateTimeService()) 
     .addService(ServerInterceptors.intercept(createBwayConfService(), authServerInterceptor)) 
     .addService(ServerInterceptors.intercept(createBwayTradeService(), authServerInterceptor)) 
     .addService(ServerInterceptors.intercept(createBwayAuthService(), authServerInterceptor)) 
     .build(); 
Preconditions.checkNotNull(server); 
server.start(); 
System.out.println("Server started, listening on " + getPort()); 
Runtime.getRuntime().addShutdownHook(new Thread() { 
    @Override 
    public void run() { 
     System.out.println("Shutting down gRPC server"); 
     TocGateway.this.stop(); 
     System.out.println("Server shut down"); 
    } 
}); 
server.awaitTermination(); 

Knoten Client-Handler (eine der Dienstleistungen, die alle anderen Dienste verwenden das gleiche Muster) -

let protoDescriptorStreaming = grpc.load((process.env.FX_LIVE_PROTO_DIR || '../tocGateway/src/main/proto') + '/streaming.proto'); 
let streamingService = new protoDescriptorStreaming.tds.fxlive.bway.BwayStreamService(process.env.TOC_GATEWAY_ADDRESS || 'localhost:8087', grpc.credentials.createInsecure()); 

Antwort

2

Die Java-Warnung harmlos ist. Ihre Anwendung sollte nach der Ausnahme normal weiterlaufen. Es wäre schön, den Loglevel zu reduzieren, um weniger Logspam zu haben, aber es sollte auch nicht die Korrektheit Ihrer Anwendung beeinflussen.

+0

Auf der Node-Seite hatte ich mit dem gleichen Problem wie das OP, aber die Antwort war, dass ich das Fehlerereignis nicht behandelte. Nachdem ich das behoben hatte, wurde meine Knotenanwendung nach dem Fehler weiter ausgeführt. –

+0

Wenn Sie beim Lernen von grpc darauf stoßen, liegt das daran, dass Sie den Client nicht ordnungsgemäß beenden - .channel.shutdown.awaitTermination (5, TimeUnit.SECONDS) Siehe http://comments.gmane.org/gmane.comp.lib. Grpc/2474 –

Verwandte Themen