我有一个带有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
方法返回。