10

我有一台服务器,它使用远程参与者框架与多个客户端进行通信。正如这个问题中提到的,我无法跟踪客户何时消失。因此,我的服务器仍在尝试向不存在的客户端发送消息。

  • 这是一个问题吗?(我没有看到任何异常被抛出- 但我认为如果我的服务器寿命很长,会有内存问题)
  • 如何检测到消息正在发送给不再收听的客户端?(如果我想实现某种连接清理
4

1 回答 1

1

好吧,我会在这里冒险。

免责声明:尽管您将在下面阅读,您可能想从这里开始

我对 scala 不熟悉,但它使用与 Erlang 类似的原理,我觉得那里有点舒服。然而,让我对你的问题感到困惑的事情与此无关。但更多的是您似乎正在建立的客户端 - 服务器关系。

根据定义,除非收到请求,否则服务器不会继续向客户端发送消息。也就是说,应该(不一定总是)围绕检查接收到的消息并采取相应措施的案例语句构建服务器参与者类。因此,在这种情况下,客户端是存在的,服务器不应该担心它,而是正常发送其回复消息,因为客户端只是通过请求使其存在感知。

因此,如果您的服务器仍在尝试向客户端发送消息,尽管这些消息已被关闭,在我看来,尽管没有收到任何请求,但它仍在尝试发送消息。在客户端-服务器关系的上下文中,这从根本上是错误的。服务器应该只对请求做出反应。否则,它将扮演客户的角色。

在任何情况下,您都可以(并且应该)定义任何客户端-服务器对话的结束。这将有助于释放资源并结束已建立的连接。对于这种效果:

  1. 您的客户端参与者应该向服务器发送停止消息,并使用 scala 为参与者类实现的任何退出函数终止其执行。

  2. 收到停止消息后,服务器参与者不应回复客户端。相反,它应该像客户端参与者一样进行清理(如果有的话)并终止执行。

通过这种方式,您可以确保正确终止所有相关参与者并正确释放资源。

我希望这会有所帮助。不幸的是,我不熟悉 scala 本身。否则我可以引入一些代码。但是上面的链接应该会有所帮助,希望如此。

于 2009-08-03T14:18:44.287 回答