我使用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或其他内容?
谢谢
答案 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()
...}