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

我正在努力尝试使用在我的eclipse环境中本地运行的大气2.0.3 tomcat 7.0.42来获得简单的基础实现(也可以从外部机器连接以查看与wireshark的流量)。 我遇到的问题是无论我使用什么传输,websocket,sse,轮询,长轮询,广播响应似乎永远不会到达客户端,并且永远不会调用response.OnMessage处理程序。 我在运行时没有收到exception,我尝试过使用firefox / chrome /和IE。 我也使用了wireshark,我看到一个包含我的消息响应的聊天消息后的数据包:“HTTP – 延续或非HTTP流量”,在数据包数据中,我可以看到发送给客户端的消息,所以它似乎服务器端正常工作。 建立与服务器的初始连接,并按预期调用js onOpen处理程序。

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

web.xml中

 AtmosphereServlet AtmosphereServlet org.atmosphere.cpr.AtmosphereServlet  oauseWebSocket true   org.atmosphere.useNative true  0 true   AtmosphereServlet /chat/*   AtmosphereServlet /chatSample/*  

的pom.xml

  javax.activation activation 1.1.1   org.atmosphere atmosphere-compat-tomcat 1.0.15   org.atmosphere atmosphere-compat-tomcat7 1.0.15   org.atmosphere atmosphere-runtime 2.0.3   org.codehaus.jackson jackson-core-asl 1.9.3   org.codehaus.jackson jackson-mapper-asl 1.9.3   javax.servlet servlet-api 2.5  

服务器端代码:

 @AtmosphereHandlerService(path="/chat", broadcasterCache = UUIDBroadcasterCache.class, interceptors = { AtmosphereResourceLifecycleInterceptor.class, BroadcastOnPostAtmosphereInterceptor.class, HeartbeatInterceptor.class }) public class ChatController extends OnMessage { 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