java - 如何保证发送 "stay alive"心跳?

标签 java concurrency rmi heartbeat

我们有一个用 Java 编写的 RMI 客户端应用程序,它需要定期向服务器应用程序发送“保持 Activity ”消息。我们将其实现为一个单独的心跳线程,它向服务器发送保持 Activity 消息,然后使用 Thread.sleep() hibernate 15 秒。

线程设置为高优先级:

Thread heartbeatThread = new Thread(new HeartbeatRunnable(server));
heartbeatThread.setPriority(Thread.MAX_PRIORITY);
heartbeatThread.start();

但是,当运行客户端的机器使用大量 CPU 时,我们发现心跳丢失,这导致服务器认为我们的客户端应用程序已经死了。

我们在我的主线程中添加了 Thread.yield() 调用,尽管这并没有使问题消失。

有什么方法可以保证在我的应用程序仍在运行时按时发送心跳?

最佳答案

你不能真正保证它。您可以在不同的线程中发送心跳,以防止发送心跳所需的时间被添加到您的延迟中。也可能建议将两次心跳之间的延迟设置为服务器用于确定客户端已死的时间的一半,即如果您的服务器在 15 秒后超时您的客户端,(尝试)每 7.5 秒发送一次心跳。

关于java - 如何保证发送 "stay alive"心跳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/676812/

相关文章:

java - 处理控制台输入(换行)

java - 当字符串输入参数的第一个字符不是预期的字符时抛出什么异常?

java - 最高效但线程安全的列表/集合

nhibernate - 从 NHibernate 的一级缓存中删除已删除的项目?或者: how to check if cached items have been deleted?

java - 如何列出网络中的所有计算机?

java - 在 RMI 注册表中设置类路径是否必要/重要?

Java RMI 教程编译时错误 - 未找到接口(interface)

java - java 路径中的反斜杠替换

java - Java中隐藏透明JScrollPane的边框

concurrency - 在 Rust 中实现 MultiplexStream