2010-12-02 13 views
0

J'ai une application multi-utilisateur composée d'un client flexible et blazeds/Spring/java backend - J'ai les principaux éléments qui fonctionnent bien à savoir. envoyer des messages à destination, consommer et produire. Les clients Flex peuvent envoyer et récupérer une chaîne de cette classe sans problème. Ce que je veux faire est d'avoir les 2 clients avec l'accès à la même variable .. dans cet échantillon brut, j'envoie un guid de chaque swf que j'ajoute à un côté serveur _players chaîne. Qu'est-ce qui se passe est quand je lance Swf A, il reçoit son guid retour bien, comme Swf B. Swf A reçoit le guid de Swf B, mais Swf B ne reçoit pas Swf A. BTW c'est le même code SWF juste lancé deux fois chacun dans un navigateur différent.Connexion de plusieurs clients flex à une seule classe java

Quelqu'un peut-il voir où je me trompe ou quelle pourrait être une meilleure solution?

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); 

     } 

Répondre

0

Vous avez un problème de threading dans votre classe. Ce n'est pas sûr si c'est la cause de votre problème - mais il pourrait.

Il semble que vous partagiez des données via la variable _player. Mais cette variable n'est pas thread-safe. Il a deux problèmes majeurs:

  • numéro 1: Si deux clients invoquent la méthode addPlayer en même temps - on ne sait pas ce qui se passe à votre variable de joueur - alt moins vous pourriez avoir quelque chose comme une mise à jour perdue
  • problème 2: (c'est peut-être la cause) - Le modèle de mémoire Java ne garantit pas que la variable _player est mise à jour dans les deux threads sans gestion de concurrence appropriée.

Pour résoudre ce problème, vous devez faire deux choses:

  • premier: envelopper _players += name + ","; dans un bloc synchronisé (pour numéro 1)
  • seconde: marque _players comme volatile (pour le numéro 2)

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

+0

choisir le moniteur utilisé pour le bloc syncronisé sage: il ne pouvait pas être 'this' – Ralph

+0

Merci pour cela.J'ai finalement trouvé le problème, mais merci pour votre aide. Le problème était en fait assez bête et en raison de la portée variable. J'ai déplacé la variable dans la classe GameFeed par opposition à la classe Thread activée par le client et cela a bien fonctionné. – MikeW

0

C'est probablement le serveur qui empêche cela. Traditionnellement, les données qui doivent être partagées entre les clients ou conservées de toute autre manière sont écrites dans une base de données ou dans une autre source de données. Vous pourriez bien faire avec un DB en mémoire. La plupart des serveurs Web ont un configuré hors de la boîte en utilisant HSQLDB ou Derby.

0

A gener Toute autre solution consisterait à utiliser une collection de threads au lieu de la chaîne, mais ceci pourrait mener à d'autres problèmes et n'est pas aussi efficace que votre chaîne. Mais néanmoins, vous devriez réécrire votre décision: utiliser une variable statique dans une classe Thread pour stocker des données métier partagées comme votre liste de joueurs.