APIにはアトミックにキャッシュ内の変数をインクリメント、あるいはデクリメントするメソッドがあります。これはすなわち、いかなる時点でクラスタを通して全てのクライアントがこれらの操作を実行しても安全であるということです。そしてこれらの操作が正しい順序で行われることが保障されています。サーバへのチャットクライアント接続数を追跡することで、これらのメソッドを試してみましょう。
main
メソッドでconnectメソッド呼び出しの後に次の行を追加します:
try { connect(serverAddress); register(); unregister(); client.shutdown(1, TimeUnit.MINUTES); } catch (IOException e) { e.printStackTrace(); }
その後、クラスの最後に次の2つのメソッドを追加してください:
private static boolean register() { userId = client.incr("UserId", 1, 1); System.out.println("You are user " + userId + "."); userCount = client.incr("UserCount", 1, 1); System.out.println("There are currently " + userCount + " connected."); return true; } private static void unregister() { client.decr("UserCount", 1); System.out.println("Unregistered."); }
これら2つのメソッドはそれぞれ、変数をインクリメントおよびデクリメントする、incr
およびdecr
メソッドの利用方法のデモになります。ここで構築しているアプリケーションは現在プログラムを実行しているユーザ数を追跡するためにこれらの機能を利用しています。ここではUserCountのキーが存在しなかった場合に利用するデフォルト値を指定してincrメソッドを実行しています。incrメソッドを実行すると現在のカウントが返ります。個の場合、最初のユーザがユーザ番号1となります。unregisterメソッドが実行されると、decrメソッドにより、UserCountの値から1が減算されます。
最後に、クラスの先頭に次の静的メンバ変数を追加する必要があります。
private static long userId = 0; private static long userCount = 0;
この時点でプログラムをコンパイルして実行すると、次の出力結果となります:
Reconnected count: -1 You are user 1. Registration succeeded. There are currently 1 connected. Enter text, or /who to see user list, or /quit to exit.
ここまでは、アプリケーションはユーザが接続するのを許可し、現在のユーザ接続数を追跡するという非常にシンプルなことを実行してきました。ここからはシステムにいくつかデータを追加して、複数のクライアント間でやり取りするためのメソッドをいつくか追加していきましょう。