1

RMIで管理するIDロックシステムを実装しようとしています。ほとんどの場合、クライアントが ID を入力すると、その ID が RMI サーバーに送信され、クライアント ID とサイクル カウンターと共にリストに格納されます。

サーバーは、30 秒後にすべてのサイクル カウンターをインクリメントします。クライアントがロック解除メッセージを送信しない限り、クライアントはハートビートを送信し、サイクル カウンターを 0 に更新します。サイクル カウンターが 3 以上の場合、サーバーはクライアントが不適切に切断されたと見なし、ロックを解放します。 ID。

私はオンラインで調査してきましたが、これを行うための非常に具体的な方法をたくさん見つけましたが、あいまいすぎるか、1 つのプロジェクトのニーズに固有すぎると思われる方法が多すぎます。これを行う方法についての一般的な考えはあると思いますが、物事をまっすぐにしたいと思います:

1 -ほとんどの実装では、この「サイクル更新」ロジックが別のスレッドの無限ループで発生します。これは正しいです?私の RMI サーバーの Main クラスはほとんど進行していないように思えますが、そこにループを実装できるかもしれません。

2 -スレッドが正しい方法である場合、いつスレッドを立ち上げますか? これを達成するために必要な特別な方法はありますか? オンラインで調べたところ、スレッドを使用するように言っているサイトがたくさんありましたが、スレッドを実行する場所の良い例を示しているサイトはありませんでした。

ご協力いただきありがとうございます。私はまだ RMI に慣れていないので、しばらくお待ちください。

4

1 に答える 1

2

あなたの問題は、RMIではなく、30分ごとに循環カウンターをインクリメントする方法だと思います。

その場合は、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();
  }
}
于 2013-12-16T20:08:05.047 に答える