当前位置: 首页 > 知识库问答 >
问题:

重新连接,同时与netty 4保持状态

鞠源
2023-03-14

我正在使用netty 4,并利用ChannelPipeline将协议状态管理等内容与编解码器分开(例如)。这真的很好用——我喜欢管道的单线程(如果需要的话)特性。

我还想管理断开/重新连接。

但是,当“断开连接”时,我想保留那些本来会发送给断开连接的人的消息。我希望这样做的同时仍然使用netty特性(即在持久化之前仍然使用管道中的处理程序进行编码等)。

不过,显然,这个(逻辑)管道的寿命超过了一个通道的寿命(当重新连接发生时,我将使用登录消息中发送的会话名称,并将所有状态拉回到新通道的管道中)。

显然,我可以在网络之外完成这一切——但我仍然希望在断开连接的情况下继续使用管道进行编码等。目前我所能想到的就是使用某种“/dev/null/”风格(自定义)的通道,当我们断开连接时,它会删除所有内容,在断开连接时适当重建管道(我们会在这个“假”死消息通道中切换)并重新连接,和一个自定义的EventExecutorGroup,以保持线程良好(即固定到'逻辑会话'状态-因此在通道之间移动)。这似乎有点'呃':)

有没有任何一种现有的模式,我没有看到记录在案,用于处理断开之间的时间

共有1个答案

葛修筠
2023-03-14

听起来你们是在努力确保“尽力而为”地交付给客户。我处理类似的事情。

在上游,您需要一个带有队列和通道组的接收器。当客户端连接时,这些接收器之一被创建并被添加到通道组中。添加消息时,它们会同时添加到队列中并写入通道组。组中的每个连接都会接收这些消息。

在重新连接时,您(神奇地)将新客户端映射回接收器,并(神奇地)确定其在队列中的位置,然后从队列中发送增量,并将其添加到组中。“神奇”的部分由你决定。

您确实需要担心这段代码中的并发,并且需要担心接收器的手动垃圾回收机制。

我是番石榴的超级粉丝,喜欢TTL和LRU缓存,我在这里使用过它们。

更新:

根据下面的说明,您要求动态构建管道并重用处理程序。管道处理程序可以重用,所以这个序列图应该基本上满足您的需要。

该图中不包括的是写入处理程序的外部html" target="_blank">进程。当ctx被分离并且连接向下流关闭时,您需要在有状态处理程序中处理对客户端的缓冲。我认为你可以实验的确切机制。

希望这有帮助。

 类似资料:
  • 问题内容: 我正在使用POST方法。我需要创建一次,并且应该使用Keep Alive Connection。但是我认为,它每次都会建立一个新的连接。 因此,我需要使用 保持活动 连接。 这是我的代码段,很多帮助将不胜感激。 而且logcat日志是: 问题答案: 10:07:29.746:D / org.apache.http.headers(1529):>>连接:保持活动 您正在要求保持活动状态。

  • 我正在创建一个客户端服务器应用程序。服务器已经设计好,等待从客户端连接。现在在客户机部分中,我希望在应用程序的整个生命周期中保持连接活动,并且只有当主客户机应用程序关闭或关闭或者服务器关闭它时,连接才会关闭。 在处理程序中我有:

  • 我有一个Android应用程序,即时通讯是其中一个关键功能。为了实现IM特性,我们使用基于的推送服务器。 编辑:我曾建议使用前台服务,但下午不喜欢通知托盘总是显示在状态栏,他希望保持干净。 任何建议都将不胜感激!

  • 选择无状态滑动窗口操作的一些注意事项是什么(例如,通过updateStateByKey或新mapStateByKey)选择保持状态(例如通过updateStateByKey或新mapStateByKey)时,使用火花流处理连续的有限事件会话流? 例如,考虑以下场景: 一种可穿戴设备跟踪由穿戴者进行的体育锻炼。该装置自动检测何时开始锻炼,并发出信息;在锻炼过程中发出附加信息(如心率);最后,当练习完

  • 问题内容: 错误代码:2013。查询期间丢失与MySQL服务器的连接 我正在使用MySQL Workbench。另外,我正在运行一批插入件,总共约1000行(例如,相乘1000次),每批插入都花费相当多的时间,其中一些超过600秒。 如何配置工作台,使其在一夜之间继续工作,而又不停止且不丢失连接? 问题答案: 从现在不可用的互联网档案中: 转到“编辑”->“首选项”->“ SQL编辑器”,然后将此