当前位置: 首页 > 面试题库 >

大气响应,广播不调用javascript onMessage处理程序

潘畅
2023-03-14
问题内容

我正在与amoat一起工作,以尝试使用在eclipse环境中本地运行的atmote 2.0.3 tomcat
7.0.42进行简单的基本实现(也可以从外部计算机进行连接以查看wireshark的流量)。无论我使用哪种传输方式,websocket,sse,轮询,长轮询,我都遇到的问题是,广播响应似乎永远不会到达客户端和响应。永远不会调用OnMessage处理程序。我在运行时没有收到异常,并且我尝试使用firefox
/ chrome /和IE。我还使用了Wireshark,在包含我的消息响应的聊天消息发布后,我看到一个数据包:“ HTTP-
Continuation或non-HTTP traffic”,并且在数据包数据中,我可以看到向客户端的传出消息,因此似乎服务器端工作正常。

我正在做的工作主要基于气氛示例聊天应用程序。如果有人有任何建议,我将不胜感激。可能还值得一提的是,我从大气示例中添加了实际的聊天处理程序,js和html页面,它也不起作用,并且也没有调用onMessage
js处理程序,因此我认为它是一个配置问题。

web.xml

<servlet>
    <description>AtmosphereServlet</description>
    <servlet-name>AtmosphereServlet</servlet-name>
    <servlet-class>org.atmosphere.cpr.AtmosphereServlet</servlet-class>
   <init-param>
        <param-name>o.a.useWebSocket</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.useNative</param-name>
      <param-value>true</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
    <async-supported>true</async-supported>
</servlet>
<servlet-mapping>
    <servlet-name>AtmosphereServlet</servlet-name>
    <url-pattern>/chat/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>AtmosphereServlet</servlet-name>
    <url-pattern>/chatSample/*</url-pattern>
</servlet-mapping>

POM.xml

<dependency>
  <groupId>javax.activation</groupId>
  <artifactId>activation</artifactId>
  <version>1.1.1</version>
</dependency>
<dependency>
    <groupId>org.atmosphere</groupId>
    <artifactId>atmosphere-compat-tomcat</artifactId>
    <version>1.0.15</version>
</dependency>
<dependency>
    <groupId>org.atmosphere</groupId>
    <artifactId>atmosphere-compat-tomcat7</artifactId>
    <version>1.0.15</version>
</dependency>
<dependency>
    <groupId>org.atmosphere</groupId>
    <artifactId>atmosphere-runtime</artifactId>
    <version>2.0.3</version>
</dependency>
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-core-asl</artifactId>
    <version>1.9.3</version>
</dependency>
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.3</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
</dependency>

服务器端代码:

@AtmosphereHandlerService(path="/chat",
broadcasterCache = UUIDBroadcasterCache.class,
interceptors = { AtmosphereResourceLifecycleInterceptor.class,
                 BroadcastOnPostAtmosphereInterceptor.class,
                 HeartbeatInterceptor.class
               })
public class ChatController extends OnMessage<String> {

    private final ObjectMapper mapper = new ObjectMapper();

    @Override
    public void onMessage(AtmosphereResponse response, String message) throws IOException {
        response.write(mapper.writeValueAsString(mapper.readValue(message, Data.class)));
    }
}

客户端Javascript(已通过polling / long-polling / sse /
websockets进行了尝试,并且所有初始都成功连接,并在初始连接后调用OnOpen处理程序:

var transport = 'long-polling';

var request = { url:'/Chat2/chat',
    contentType : "application/json",
    logLevel : 'debug',
    transport : transport,
    trackMessageLength : true,
    reconnectInterval : 5000,
    fallbackTransport: 'polling'};


request.onOpen = function(response) {
    console.log('OnOpen: Atmosphere connected using ' + response.transport );
    transport = response.transport;
};

request.onReopen = function(response) {
    console.log('OnReopen: connection reopened');
};


request.onTransportFailure = function(errorMsg, request) {
    atmosphere.util.info(errorMsg);
    if (window.EventSource) {
        request.fallbackTransport = "polling";
    }
    console.log('OnTransportFailure: Atmosphere Chat. Default transport is WebSocket, fallback is ' + request.fallbackTransport);
};

request.onMessage = function (response) {
    alert('OnMessage: message received');
};

request.onClose = function(response) {
    console.log('OnClose: Client closed the connection after a timeout');
    subSocket.push(atmosphere.util.stringifyJSON({ author: author, message: 'disconnecting' }));
};

request.onError = function(response) {
    console.log('OnError: error occurred');
    console.log(response);
    logged = false;
};

request.onReconnect = function(request, response) {
    console.log('OnReconnect: Reconnected');
};

subSocket = socket.subscribe(request);

$('#chatSubmit').click(function() {
    var msg = $('#chatText').val();

    subSocket.push(atmosphere.util.stringifyJSON({ author: author, message: msg }));
    $('#chatText').val('');
});

问题答案:

如果在客户端设置了trackMessageLength:true,则必须安装TrackMessageLengthInterceptor。因此,将其添加到AtmosphereHandlerService的拦截器列表中。

-让弗朗西斯(Jeanfrancois)



 类似资料:
  • 我正在使用一个Flink流式Java应用程序,输入源为Kafka。在我的应用程序中总共使用了4个流。一个是主数据流,另一个3个用于广播流。 我加入了使用任何一种类型的三个广播流。我已经作为流B广播,并且能够在广播过程函数上下文状态(即在processBroadcastElement())中接收。 我的问题是, > 是否可以在广播状态下存储大数据? 注意:根据我的理解,Flink广播状态在运行时保存

  • 所以,我在做一些需要我知道设备上的另一个应用程序何时更新的事情。所以我的问题很简单,让我们说YouTube或Spotify在应用程序更新时发送广播,如果是这样,我需要用我的广播接收器捕捉什么。

  • 我正在开发一个用PHP编写的预分叉TCP套接字服务器。 守护进程(父进程)分叉一定数量的子进程,然后等待,直到它被告知退出并且子进程都走了或者它收到信号。 SIGINT和SIGTERM使其将SIGTERM发送给所有子级。 孩子们建立了他们自己的信号处理器:SIGTERM导致一个干净的退出。SIGUSR1导致它转储一些状态信息(只需在下面的示例代码中打印出它收到了信号)。 如果子异常退出,则父级启动

  • 我知道这个问题已经被问了很多,但我所看到的答案都没有帮助我澄清这个问题。我需要更多的指导方针,而不是一个具体的答案。 错误,没有这样的用户 到目前为止,我所尝试的是为列表中收到的每个对象创建一个类: 和Api,我认为这就是问题所在: 提前感谢!!

  • 在我们的spring boot应用程序中,我们出于某种目的调用外部API,它将返回大约20mb的JSON数据作为响应。收到响应后,使用ObjectMapper将响应映射到POJO。 我们正在使用RestTemboard调用API并接收响应。 在Spring启动应用程序中处理大型响应数据而不会出现内存问题的最佳实践是什么? 谢谢

  • 问题内容: 我的网络服务返回一个JSON对象,如下所示 即,当我将此地址放入chrome浏览器中时,我可以到达上面。 我正在尝试在浏览器中阅读此内容,以便可以创建一个下拉选项…但是从以下代码开始我一无所获: 我总是在警报框中。我用fiddler2再次检查了Web服务请求/响应是否正常,我什至可以拦截Web服务和浏览器之间的json对象。 我也试过 我又得到了空。 我已经看过Ajax要求的json响