气氛响应,广播不调用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