GRPC服务器取消客户端

时间:2017-04-23 23:11:16

标签: java server netty grpc grpc-java

我使用grpc为网络摄像头流创建了一个微服务。流式传输工作正常,但流的取消仅适用于客户端。

如果客户端调用CancellableContext.cancel,则视频流停止但服务器仍在使用cam传输视频。如果取消被调用,则服务器抛出Transport faild Exception。

是否可以捕获此异常以阻止服务器端的流式传输或其他操作?

ClientCall<KameraStreamRequest, KameraStreamResponse> call = (ClientCall) imageStreamBlockingStub.getChannel().newCall(ImageStreamServiceGrpc.METHOD_IMAGE_DATA_STREAM, imageStreamBlockingStub.getCallOptions());
call.sendMessage(KameraStreamRequest.newBuilder().setStreamState(StreamState.STOP).build());

流式传输以简单的请求启动,该请求具有State.START的枚举。如果我调用上面的代码将状态更改为STOP,我将成为例外:

Exception in thread "main" java.lang.IllegalStateException: Not started
at com.google.common.base.Preconditions.checkState(Preconditions.java:174)
at io.grpc.internal.ClientCallImpl.sendMessage(ClientCallImpl.java:388)
at org.cpm42.grpcservice.ImageStreamClient.cancelStream(ImageStreamClient.java:70)
at org.cpm42.main.StreamClientMainClass.main(StreamClientMainClass.java:21)

我读过这可能是一个错误。

是否可以在服务器端获取Sessions或Connections或其他内容?

谢谢

2 个答案:

答案 0 :(得分:0)

这可能是一个稍微不同的问题,但对于一个简单的客户端/服务器项目,我需要向客户端方法添加: var x:Int=0 val dictionary:scala.collection.immutable.Map[Node, Int] // read the RDF/XML file model.read(in, null) val iter:StmtIterator = model.listStatements() // print out the predicate, subject and object of each statement def print { while (iter.hasNext) { { x+=1 val stmt: Statement = iter.nextStatement val subject: Node = stmt.getSubject.asNode() dictionary(subject,x) x+=1 val predicate: Node = stmt.getPredicate.asNode() dictionary(predicate,x) x+=1 val obj: Node = stmt.getObject.asNode() dictionary(obj,x) } } for ((k,v) <- dictionary) printf("key: %s, value: %s\n", k, v) } ,以请求摆脱异常。

channel.shutdown().awaitTermination(5, SECONDS);

你的堆栈跟踪的其余内容是什么意思?

答案 1 :(得分:0)

不确定是否有帮助。但是您可以尝试在服务器端轮询gRPC上下文(如果调用已取消)并采取相应措施:

import io.grpc.Context;
{ ...
    Context.current().isCancelled()
 ...}