javascript - Atmosphere :服务器收到消息

标签 javascript atmosphere atmosphere.js

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

消息 = { 身份:“唯一ID”, 状态:“状态消息值” });

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

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

最佳答案

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

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

关于javascript - Atmosphere :服务器收到消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37206792/

相关文章:

javascript - 如何从父页面获取属性值。我尝试使用opener和window.parent。但是不起作用

javascript - 如何一次只在一个数组元素上 setState?

java - 带有 asynchttpclient 的 JSON 帖子

java - Atmosphere 响应,广播不调用 javascript onMessage 处理程序

java - 在长轮询的情况下, Atmosphere 框架会在服务器上抛出错误

javascript - 如何在 Meteor js 中创建带幻灯片的产品 View

javascript - 单击 Laravel 中的下拉标签后隐藏回显

javascript - 在没有窗口对象的情况下正确记录 JavaScript 中的按键事件

firefox - Primepush ...无法建立连接,Websocket关闭,原因: Connection was closed abnormally