2010-12-02 27 views
0

私は、フレックスクライアントとblazeds/Spring/javaバックエンドからなるマルチユーザーアプリケーションを持っています。メッセージを宛先に送信し、消費し、生成する。 Flexクライアントは、このクラスの文字列を問題なく送信し、取得できます。私がしたいのは、2つのクライアントに同じ変数へのアクセスを持たせることです。この粗いサンプルでは、​​文字列_playersサーバー側に追加する各swfからGUIDを送信します。 Swf Aは、Swf Aを起動すると、Swf Bと同じようにGUIDを返します。その後、Swf AはSwf BからGUIDを受け取るが、Swf BはSwf Aを受け取らない。BTWこれはちょうど2回起動された同じswfコードであるそれぞれ別のブラウザにあります。複数のflexクライアントを単一のJavaクラスに接続

誰かが私が間違っているか、もっと良い解決策があるのか​​分かりませんか?

public class GameFeed { 

    private static GaneFeedThread thread; 

    private final MessageTemplate template; 

    public GameFeed(MessageTemplate template) { 
     this.template = template; 
    } 

    public void start() { 
     if (thread == null) { 
      thread = new GaneFeedThread(this.template); 
      thread.start(); 
     } 
    } 

    public void stop() { 
     thread.running = false; 
     thread = null; 
    } 

    public static class GaneFeedThread extends Thread { 

     public boolean running = false; 

     private final MessageTemplate template; 

     public GaneFeedThread(MessageTemplate template) { 
      this.template = template; 
     } 

     private static String _players; 

     public void addPlayer(String name) 
     { 
      _players += name + ","; 
     } 
     while (this.running) { 


       this.template.send("game-feed", _players); 

     } 

答えて

0

あなたのクラスにスレッドの問題があります。これがあなたの問題の原因であるかどうかは分かりませんが、それは可能です。

_player変数を使用してデータを共有しています。しかし、この変数はスレッドセーフではありません。これは、2つの大きな問題があります。

  • 問題1:2つのクライアントが同時にaddPlayerメソッドを呼び出す場合 - あなたのプレーヤーの変数に起こる何明確ではありません - ALT少なくともあなたが失われた更新
  • のようなものを持っている可能性があり
  • 問題2(これは多分原因です) - Javaメモリモデルは、_player変数が適切な並行性管理なしで両方のスレッドで更新されることを保証しません。

    • 最初:
    • 秒(問題1)同期ブロックに_players += name + ",";をラップ:マーク_playersvolatileとして(問題2)

    あなたは二つのことをしなければならない、それを修正するには

@see http://jeremymanson.blogspot.com/2008/11/what-volatile-means-in-java.html

+0

同期化されたブロックに使用されるモニタを選択してください:「これ」できません – Ralph

+0

これはありがとうございます。私は結局問題を発見しましたが、あなたの援助に感謝します。問題は実際には非常にばかげていて、可変スコープのためでした。私は変数をGameFeedクラスに移しました。これは、クライアントが起動したスレッドクラスではなく、うまくいきました。 – MikeW

0

おそらくこれを防ぐサーバーです。伝統的に、クライアント間で共有されるデータ、またはそれ以外の方法で永続化されるデータは、DBまたは他のデータソースに書き込まれます。メモリ内のDBでうまくいくかもしれません。ほとんどのWebサーバーには、HSQLDBまたはDerbyを使用してすぐに構成されたものがあります。

0

GENER他の解決策は、文字列の代わりにスレッドを保存するコレクションを使用しますが、これは私の他の問題の原因となり、文字列のように効率的ではありません。

しかし、スレッドリストの静的変数を使用して、プレイヤーリストのような共有ビジネスデータを格納することは、意思決定を迫るものです。

関連する問題