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

Je suis une exception comme ci-dessus quand je l'appelle un autre service de GRPC dans un processus de poignée de serveur GRPC avec le futur rappel &.futur rappel GRPC a exception: StatusRuntimeException: ANNULE

Mon code comme ceci:

handle(){ 

.... 

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

... 

} 

L'accès a été annulé une fois terminé la poignée() du processus.

Comment puis-je résoudre le problème?

+0

L'annulation se produit en présence d'une erreur côté client ou a été annulée par le code de l'application (c'est-à-dire votre code). Êtes-vous sûr de ne pas annuler le futur quelque part? –

Répondre

0

Les RPC sortants d'un serveur sont implicitement liés à la requête entrante qui les a déclenchés, via io.grpc.Context. Si vous faites un RPC qui procède même après que le RPC entrant terminée, vous devez utiliser 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) est également une alternative pratique à utiliser attach/détacher directement.