2016-05-13 1 views
0

j'ai un ManagedService avec fonction onMessageAmbiance: serveur reçoit son message

@ManagedService(path = "/atmosphere/formuserpresence/{id}") 
public class FormUserPresenceUpdate extends AtmosphereHelper 
{ 

    @Message 
    public final void onMessage(final String message) throws IOException 
    { 
     ... 
     ... 
     ... 
     ... 
     broadcast(FormUserPresenceUpdate.class, "/atmosphere/formuserpresence/" + statusMessage.getId(), returnArrayString); 
    } 

} 

Et je la communication client-serveur. Plusieurs clients peuvent s'abonner à cette chaîne en utilisant leurs identifiants. Ensuite, le client peut envoyer un statut, comme

message = { ident: "UNIQID", statut: "statusMessageValue" });

Classe FormUserPresenceUpdate stocke tous les statuts reçus de tous les clients et les renvoie en tant que tableau sous la forme d'une fonction de diffusion en tant que messages (returnArrayString). Le problème est que, si les clients reçoivent les valeurs correctes (le tableau de messages), le serveur reçoit également ce tableau de lui-même et n'a pas réussi à l'analyser. Donc, la question est: quelle est la solution à cette situation? Puis-je en quelque sorte le faire, de ne pas envoyer ce tableau de messages par le serveur lui-même? Ou devrais-je créer une deuxième chaîne (je ne voudrais vraiment pas faire ça)?

Répondre

1

Vous devez définir votre message en tant que classe et définir un décodeur pour cette classe;)

public class Message { 
    private String ident; 
    private String status; 
    ... 

    getter and setter method. 

    ... 
} 

décodeur (cela dépendra com.fasterxml.jackson.databind.ObjectMapper):

public class MessageDecoder implements Decoder<String, Message> { 

    private ObjectMapper mapper = new ObjectMapper(); 

    @Override 
    public Message decode(String s) { 
     try { 
      return mapper.readValue(s, Message.class); 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 

Et ajouter decoders = {MessageDecoder.class} à @Message:

@Message(decoders = {MessageDecoder.class}) 
public final void onMessage(final String message) throws IOException 
{ 
    ... 
    ... 
    ... 
    ... 
    broadcast(FormUserPresenceUpdate.class, "/atmosphere/formuserpresence/" + statusMessage.getId(), returnArrayString); 
} 

Et il y a un autre r solution, utilisez JSONParser pour déterminer si le message peut être analysé dans la classe Message ou non, laissez @Messsage retourner la méthode.

+0

Merci pour votre réponse. J'ai résolu mon problème particulier en remplaçant la fonction de diffusion par 'return message'. De cette façon, tous les abonnés reçoivent le message, mais pas le serveur, ce qui était bien pour moi. Également trouvé un indice ici [link] (http://atmosphere-framework.2306103.n4.nabble.com/ManagedService-with-Post-tp4657184p4657185.html) où il est dit, que si le décodeur pour le 'onMessage 'la méthode ne parvient pas à décoder l'objet, cette' onMessage' sera ignorée. Je pense que cela vaut la peine d'ajouter à votre message pour d'autres utilisateurs. Quoi qu'il en soit, marqué la question comme acceptée, merci. :-) – CodeMonkey