2016-05-13 19 views
0

Ich habe eine ManagedService mit onMessage FunktionAtmosphäre: Server erhält seine Nachricht

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

} 

Und ich habe Client-Server-Kommunikation. Mehrere Clients können diesen Kanal mit ihren IDs abonnieren. Dann kann der Client einen Status senden, wie

message = { ident: "uniqid", Status: "statusMessageValue" });

Die Klasse FormUserPresenceUpdate speichert alle empfangenen Status aller Clients und sendet sie per Broadcast-Funktion als Array als Nachrichten zurück (returnArrayString).

Das Problem ist, dass, ob die Clients die richtigen Werte (das Array von Nachrichten) erhalten, der Server dieses Array auch von sich selbst erhält und fehlgeschlagen, es zu analysieren. Die Frage ist also: Was ist die Lösung für diese Situation? Kann ich es irgendwie so machen, dieses Nachrichtenfeld nicht vom Server selbst zu versenden? Oder sollte ich einen zweiten Kanal erstellen (das möchte ich wirklich nicht)?

Antwort

1

Sie sollten Ihre Nachricht als eine Klasse definieren und einen Decoder für diese Klasse definieren;)

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

    getter and setter method. 

    ... 
} 

Decoder (dies wird auf com.fasterxml.jackson.databind.ObjectMapper abhängen):

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

Und füge decoders = {MessageDecoder.class} zu @Message:

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

Und es gibt eine andere Verwenden Sie JSONParser, um zu bestimmen, ob die Nachricht in die Nachrichtenklasse geparst werden kann oder nicht, falls nicht, lassen Sie die Methode @Messsage zurückgeben.

+0

Danke für die Arbeit zu beantworten. Ich habe mein spezielles Problem gelöst, indem ich die Broadcast-Funktion durch 'Return Message' ersetzt habe. Auf diese Weise erhalten alle Abonnenten die Nachricht, aber der Server nicht, was für mich in Ordnung war. Auch hier einen Hinweis gefunden [Link] (http://atmosphere-framework.2306103.n4.nabble.com/ManagedService-with-Post-tp4657184p4657185.html) wo es heißt, dass wenn der Decoder für die onMessage 'Methode kann Objekt nicht dekodieren, diese' onMessage' wird übersprungen. Ich denke, es lohnt sich, Ihren Beitrag für andere Nutzer hinzuzufügen. Wie auch immer, markiert die Frage als akzeptiert, danke. :-) – CodeMonkey