2016-05-13 107 views
0

我有功能的onMessage氛围:服务器接收其消息

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

} 

一个ManagedService我有客户端 - 服务器的通信。几个客户可以使用他们的ID来订阅这个频道。然后,客户端可以发送状态,像

消息= { IDENT: “uniqId”, 状态: “statusMessageValue” });

类FormUserPresenceUpdate存储所有客户端的所有接收状态,并通过广播函数将其作为数组作为消息(returnArrayString)返回。

问题是,无论客户端是否收到正确的值(消息数组),服务器也会从本身接收此数组并且无法解析它。所以问题是:这种情况的解决方案是什么?我可以以某种方式使它成为这样,而不是通过服务器本身发送这组消息?或者我应该创建第二个频道(我真的不想那么做)?

回答

1

你应该定义你的消息作为一类,并定义为这个类的一个解码器;)

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

    getter and setter method. 

    ... 
} 

解码器(这将取决于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); 
     } 
    } 
} 

并添加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); 
} 

还有其他r解决方案,使用JSONParser来确定消息是否可以被解析为消息类,如果不是,则返回@Messsage方法。

+0

感谢您的工作答案。我用'return message'解决了我的特殊问题,取代了广播功能。通过这种方式,所有用户都收到这条消息,但服务器没有,这对我来说很好。 在这里还发现了一个提示[链接](http://atmosphere-framework.2306103.n4.nabble.com/ManagedService-with-Post-tp4657184p4657185.html)在哪里说,如果解码器的onMessage '方法无法解码对象,这个'onMessage'将被跳过。我认为,这是值得添加到您的文章为其他用户。 无论如何,标记为接受的问题,谢谢。 :-) – CodeMonkey

相关问题