JSF*_*JSF 8 go protocol-buffers grpc
我有一个 GRPC 服务器,它提供一个函数并返回一个流。我想将流保存到map[string]grpc.Stream- 这到目前为止有效。
我的问题是在返回流的函数完成其逻辑后流被关闭。
这是,我到目前为止:
func (s *server) CheckConnection(initMessage *LighterGRPC.InitMessage, stream LighterGRPC.Lighter_CheckConnectionServer) error {
//Do something magic
streams[initMessage.DeviceID] = stream
error := stream.Send(&LighterGRPC.ColorMessage{DATA})
if error {
log.Println(error)
}
//Tried
//for { }
return error
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试让函数for {}在返回之前永远不返回任何带有 an 的东西(如上面的代码中所述),但这没有帮助,我认为这不是解决方案。
有没有办法让流保持打开状态,以便我可以稍后在运行时通过它向客户端发送数据?
对于那些可能遇到同样问题的人,这里有一个快速解决方案。基本上,您需要将流包装在一个结构中,以便出现错误。Return 将阻塞,直到执行stream.Send() 时发生错误为止
type Connection struct {
stream LighterGRPC.Lighter_CheckConnectionServer
error chan error
}
Run Code Online (Sandbox Code Playgroud)
你的地图将是这样的:
type Server struct {
....
conns map[string]Connection
}
Run Code Online (Sandbox Code Playgroud)
最后创建流的 RPC 应该是这样的:
conn := Connection{
stream: stream,
error: make(chan error),
}
s.conns[initMessage.DeviceID] = conn
return <-conn.error
Run Code Online (Sandbox Code Playgroud)
这样,您的流将在“活动”时存储在地图中。
| 归档时间: |
|
| 查看次数: |
1375 次 |
| 最近记录: |