0

多数の同時クライアントがあります。つまり、スレッドが実行され、同時に何かを実行しています。各クライアントは、イベントバスのリスナーを実装します。そのバスからのメッセージは、1つ以上のクライアントに到着する可能性があります。私の仕事は、そのメッセージをすべてのクライアントにブロードキャストすることです。

この作業は簡単に思えますが、なんらかの形で醜くない解決策を見つけることができません。

(1)簡単な解決策:

void onMessageArrived(Message message) {
   broadcast(message);
}
  • 複数のクライアントがそのメッセージを受信できるため、各メッセージが何度もブロードキャストされ、複数のonMessageArrivedハンドラーが実行される可能性があるため、これは悪いことです。

(2)ブロードキャストされたメッセージをいくつかのリストに保存できます。

void onMessageArrived(Message message) {
 if (alreadyBroadcastedConcurrentMap.putIfAbsent(message)==null) {
     broadcast(message);
 }
}
  • これにより、前述の問題は解決されますが、多くのクライアントは、既存のメッセージをそのリストに入れるという無駄な操作を繰り返します。

しかし、いくつかのより良いオプションがあるかもしれませんか?

Java。

4

2 に答える 2

1

問題は、そもそも複数のメッセージを受信するという事実にあります。理論的には、ブロードキャストするリクエストを5つ受け取る必要がある場合は、イベントシステムの動作方法によって5つのブロードキャストを実行する必要があります。簡単に言えば、それがあなたが望むものでないなら、あなたはこのパターンを使うべきではありません。

複数のメッセージを受信することが制御できない場合は、少なくとも、メッセージを渡す受信者は、繰り返されるメッセージを記録し、他のスレッドに渡すのではなく無視する必要があります。

要するに、スレッドはそれが言われたことだけをします。別のスレッドの状態を気にする必要はないので、スレッドに渡す前にパターンを切り替えるか、メッセージをインターセプトする必要があります。

于 2012-09-24T12:52:10.720 に答える
0

デザインに欠陥が含まれているか、説明が不十分です。すべてのクライアントにブロードキャストするか、選択したリストにマルチキャストします。一部の受信者を指定してから、各受信者にそれを他のすべてのクライアントに配信し、重複やレースを手作業で処理する責任を負わせるのは意味がありません。すべてのクライアントにバスをリッスンさせ、メッセージを無視するようにします。

新しいセントラルを紹介しますBroadcaster

public class Broadcaster {

  List<Client> clients;

  public void broadcast(Message msg) {
    for (Client client: clients)
      if (!msg.from().equals(client))
        msg.send(client);
  }
}

明らかに、各クライアントはこのブロードキャストドメインに登録する必要があります

public class Client {

  private Broadcaster broadcaster;

  public void join(Broadcaster broadcaster) {
    this.broadcaster = broadcaster;
    broadcaster.announce(this);
  }

}

複数の配信を忘れてください。クライアントの数が膨大で、他の非常に厳しい要件がある場合は、複数のブロードキャストドメインを使用して、さらに進んでLANをシミュレートできます。

于 2012-09-24T18:05:27.213 に答える