2017-04-20 54 views
0
io.grpc.StatusRuntimeException: CANCELLED 
    at io.grpc.Status.asRuntimeException(Status.java:539) 
    at io.grpc.stub.ClientCalls$UnaryStreamToFuture.onClose(ClientCalls.java:439) 
    at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:422) 
    at io.grpc.internal.ClientCallImpl.access$100(ClientCallImpl.java:74) 
    at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.close(ClientCallImpl.java:508) 
    at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.access$700(ClientCallImpl.java:425) 
    at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:540) 
    at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:52) 
    at io.grpc.internal.SerializeReentrantCallsDirectExecutor.execute(SerializeReentrantCallsDirectExecutor.java:64) 
    at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.closed(ClientCallImpl.java:544) 
    at io.grpc.internal.AbstractClientStream2$TransportState.closeListener(AbstractClientStream2.java:307) 
    at io.grpc.internal.AbstractClientStream2$TransportState.transportReportStatus(AbstractClientStream2.java:287) 
    at io.grpc.netty.NettyClientHandler.cancelStream(NettyClientHandler.java:455) 
    at io.grpc.netty.NettyClientHandler.write(NettyClientHandler.java:231) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:739) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:731) 
    at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:817) 
    at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:724) 
    at io.netty.channel.DefaultChannelPipeline.write(DefaultChannelPipeline.java:1022) 
    at io.netty.channel.AbstractChannel.write(AbstractChannel.java:291) 
    at io.grpc.netty.WriteQueue.flush(WriteQueue.java:124) 
    at io.grpc.netty.WriteQueue.access$000(WriteQueue.java:46) 
    at io.grpc.netty.WriteQueue$1.run(WriteQueue.java:58) 
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) 
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:403) 
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:445) 
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858) 
    at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144) 
    at java.lang.Thread.run(Thread.java:745) 

我得到了一個例外,當我打電話與未來&回調GRPC服務器處理過程中的另一個GRPC服務上面。GRPC將來回調了異常:StatusRuntimeException:取消

我這樣的代碼:

handle(){ 

.... 

***FutureClient futureClient = ... 
ListenableFuture<***> future = futureClient.call(...); 
Futures.addCallback(future, new FutureCallback<>() {...}); 

... 

} 

當進程句柄()完成了訪問被取消。

我該如何解決問題?

+0

當存在客戶端錯誤或者被應用程序代碼(即您的代碼)取消時會取消。你確定你沒有取消未來的某個地方嗎? –

回答

0

來自服務器的傳出RPC通過io.grpc.Context隱式綁定到觸發它們的傳入請求。如果你這樣做,即使進行後傳入RPC完成了RPC你應該使用context.fork()

Context forked = Context.current().fork(); 
Context old = forked.attach(); 
try { 
    // RPCs at this point can continue after the incoming RPC completes 
    futureClient.call(...); 
} finally { 
    forked.detach(old); 
} 

Context.run(Runnable)也是一個方便的替代使用附加/分離直接。