气氛:服务器收到消息

Atmosphere: server receives its message

我有一个带有 onMessage 功能的 ManagedService

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

}

而且我有客户端-服务器通信。多个客户可以使用他们的 ID 订阅这个频道。然后,客户端可以发送一个状态,比如

留言={ 身份:"uniqId", 状态:"statusMessageValue" });

Class FormUserPresenceUpdate 存储所有客户端的所有接收状态,并通过广播功能将它们作为消息 (returnArrayString) 作为数组发回。

问题在于,无论客户端是否接收到正确的值(消息数组),服务器也从自身接收到该数组,但无法解析它。那么,问题是:这种情况的解决方案是什么?我能以某种方式做到这一点,而不是由服务器本身发送这组消息吗?或者我应该创建第二个频道(我真的不想那样做)?

您应该将消息定义为 class 并为此定义解码器 class;)

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

还有一个方案,用JSONParser判断message是否可以解析成Messageclass,如果不能,让@Messsage方法return。