Java RMI心跳时间进程循环

标签 java multithreading rmi heartbeat

我正在尝试实现一个由 RMI 管理的 ID 锁系统。基本上,当客户端输入 ID 时,它会将该 ID 发送到 RMI 服务器,RMI 服务器将其与客户端 ID 和周期计数器一起存储在列表中。

30 秒后,服务器将增加所有周期计数器。除非客户端发送 Unlock 消息,否则客户端将发送 Heartbeat,这会将周期计数器更新回 0。如果周期计数器 >= 3,则服务器将假定客户端已正确断开连接并释放 ID 上的锁定。

我一直在网上进行研究,发现了很多非常具体的方法来做到这一点,但是太多的方法看起来太模糊,或者对于一个项目的需求来说太具体。我想我对如何做到这一点有一个大致的了解,但我想把事情搞清楚:

1 - 大多数实现都会在单独线程的无限循环中发生这种“循环更新”逻辑。它是否正确?看起来我的 RMI 服务器的 Main 类几乎没有发生任何事情,也许我可以在那里实现循环。

2 - 如果该线程确实是正确的方式,那么我什么时候启动该线程?有什么特殊的方法可以实现这一点吗?我在网上查了一下,发现很多网站都说要使用线程,但没有一个网站显示出执行线程的良好示例。

感谢您提供的任何帮助。我对 RMI 还不太了解,所以感谢您的耐心等待。

最佳答案

我认为,您的问题是如何每 30 分钟增加循环计数器,而不是 RMI。

如果是这样,您可以使用 ScheduledExecutorService。

下面有一个伪代码。

public class IdLockMgr {
  private Map<String, Integer> idToCycleMap = new HashMap<>();
  private ScheduledExecutorService service;
  public IdLockMgr() {
     service = Executors.newScheduledThreadPool(1);
     //BAD
((ScheduledThreadPoolExecutor)service).setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
     service.scheduleAtFixedRate(...);//this is point.
  }
  public void lockId(String id) {
    idToCycleMap.put(id, 0);
  }
  public void shutdown() {
     service.shutdown();
  }
}

关于Java RMI心跳时间进程循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20619641/

相关文章:

java - 这个黑客想用这个 Java 代码做什么?

c - 使用互斥体和条件变量调度多个线程

java - 如何通过java代码设置JMX远程端口系统环境参数进行远程监控?

Java RMI UnmarshalException 和 AWS EC2 服务器

java - Swing滚动问题

java - 文件池(如连接池)

java - 在eclipse中导入Android源码

c# - ConcurrentQueue <T>或Queue <T>当一个线程仅入队而另一个线程仅出队

c++ - OpenMP set_num_threads() 不工作

java - 是否可以从服务器代码本身打开 RMI 注册表