我有一个带有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订阅此频道。然后,客户端可以发送状态,例如

讯息= {
      ident:“ uniqId”,
      状态:“ statusMessageValue”
    });

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

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

最佳答案

您应该将消息定义为一个类,并为此类定义一个解码器;)

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解析为Message类,如果不能,则让@Messsage方法返回。

07-24 19:10
查看更多