2017-04-20 12 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) 

CANCELED私は私が将来&コールバックとgrpcのサーバー・ハンドル・プロセス内の別のgrpcサービスを呼び出す時には、上記のように例外が発生しました。gRPC将来のコールバックは、例外が発生しました

このような私のコード:

handle(){ 

.... 

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

... 

} 

プロセスハンドル()が完了したときにアクセスがキャンセルされました。

この問題を解決するにはどうすればよいですか?

+0

キャンセルは、クライアント側のエラーが発生した場合、またはアプリケーションコード(コード)によってキャンセルされた場合に発生します。あなたはどこか未来をキャンセルしていないと確信していますか? –

答えて

0

サーバからの発信RPCは、それらを起動した着信要求に暗黙に結びついています(io.grpc.Context経由)。あなたは、着信RPCは、あなたがcontext.fork()を使用する必要があります完了した後も進み、RPCを行っている場合:

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)も直接アタッチ/デタッチ使用に便利な代替手段です。

関連する問題