2016-06-13 42 views
0

我正在使用基於此onetwo示例項目的帶有Atmosphere Framework的Spring-Boot(嵌入式容器)。大氣框架Websocket返回空回覆車身

我想從一個資源做一個非常簡單的廣播,瀏覽器收到消息,但responseBody是空字符串「」。我通過大部分的Atmosphere代碼進行了調試,從我可以告訴我的JSON消息已成功添加到異步寫入隊列中,但仍然在瀏覽器上顯示爲空。

我認爲最初可能是Atmosphere正在過濾消息,但調試顯示它不是。

enter image description here

相關的pom.xml

<spring-boot-starter-web.version>1.3.3.RELEASE</spring-boot-starter-web.version> 
<atmosphere-runtime.version>2.2.4</atmosphere-runtime.version> 
<atmosphere-javascript.version>2.2.3</atmosphere-javascript.version> 

相關跟蹤日誌:

17:39:59.813 TRACE o.atmosphere.cpr.DefaultBroadcaster - /websocket/notifications is about to broadcast Entry{message={"id":1,"msg":"Hello, World"}, type=ALL, [email protected]} 

大氣配置

package com.hello; 

import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRegistration; 

import org.atmosphere.cache.UUIDBroadcasterCache; 
import org.atmosphere.cpr.ApplicationConfig; 
import org.atmosphere.cpr.AtmosphereFramework; 
import org.atmosphere.cpr.AtmosphereServlet; 
import org.atmosphere.cpr.MetaBroadcaster; 
import org.springframework.boot.context.embedded.ServletContextInitializer; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
public class AtmosphereConfiguration implements ServletContextInitializer { 

    @Bean 
    public AtmosphereServlet atmosphereServlet() { 
     return new AtmosphereServlet(); 
    } 

    @Bean 
    public AtmosphereFramework atmosphereFramework() { 
     return atmosphereServlet().framework(); 
    } 

    @Bean 
    public MetaBroadcaster metaBroadcaster() { 
     AtmosphereFramework framework = atmosphereFramework(); 
     return framework.metaBroadcaster(); 
    } 

    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 
     configureAthmosphere(atmosphereServlet(), servletContext); 
    } 

    private void configureAthmosphere(AtmosphereServlet servlet, ServletContext servletContext) { 
     ServletRegistration.Dynamic atmosphereServlet = servletContext.addServlet("atmosphereServlet", servlet); 
     atmosphereServlet.setInitParameter(ApplicationConfig.ANNOTATION_PACKAGE, "com.hello"); 
     atmosphereServlet.setInitParameter(ApplicationConfig.BROADCASTER_CACHE, UUIDBroadcasterCache.class.getName()); 
     atmosphereServlet.setInitParameter(ApplicationConfig.BROADCASTER_SHARABLE_THREAD_POOLS, "true"); 
     atmosphereServlet.setInitParameter(ApplicationConfig.BROADCASTER_MESSAGE_PROCESSING_THREADPOOL_MAXSIZE, "10"); 
     atmosphereServlet.setInitParameter(ApplicationConfig.BROADCASTER_ASYNC_WRITE_THREADPOOL_MAXSIZE, "10"); 
     servletContext.addListener(new org.atmosphere.cpr.SessionSupport()); 
     atmosphereServlet.addMapping("/websocket/*"); 
     atmosphereServlet.setLoadOnStartup(0); 
     atmosphereServlet.setAsyncSupported(true); 
    } 

} 

大氣資源

package com.hello; 

import java.nio.charset.StandardCharsets; 

import org.atmosphere.config.service.Disconnect; 
import org.atmosphere.config.service.ManagedService; 
import org.atmosphere.config.service.Ready; 
import org.atmosphere.cpr.AtmosphereResource; 
import org.atmosphere.cpr.AtmosphereResourceEvent; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

@ManagedService(path = NotificationAtmosphereResource.PATH) 
public class NotificationAtmosphereResource { 

    public static final String PATH = "/websocket/notifications"; 

    private Logger logger = LoggerFactory.getLogger(NotificationAtmosphereResource.class); 

    public void init(AtmosphereResource resource){ 
     resource.getResponse().setCharacterEncoding(StandardCharsets.UTF_8.name()); 
    } 

    @Ready 
    public void onReady(final AtmosphereResource resource) { 
     logger.info("Connected {}", resource.uuid()); 
    } 

    @Disconnect 
    public void onDisconnect(AtmosphereResourceEvent event) { 
     logger.info("Client {} disconnected [{}]", event.getResource().uuid(), 
       (event.isCancelled() ? "cancelled" : "closed")); 
    } 

} 

服務從我發出的郵件

package com.hello; 

import org.atmosphere.cpr.MetaBroadcaster; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 

@Service 
public class NotificationEmitterBean implements NotificationEmitter { 

    private Logger logger = LoggerFactory.getLogger(NotificationEmitterBean.class); 

    @Autowired 
    private MetaBroadcaster metaBroadcaster; 

    @Autowired 
    private NotificationService notificationService; 

    @Autowired 
    private JsonMapper jsonMapper; 

    @Override 
    public void emitForJob(String msg) { 
    metaBroadcaster.broadcastTo(NotificationAtmosphereResource.PATH, 
        jsonMapper.toJson(msg));   
     } 

    } 

} 

回答

0

我不能相信我沒有嘗試這個早期的,但實際上JSON有在使用console.dir登錄時,responseBody只是不顯示在控制檯中!

我不知道爲什麼console.dir(response)顯示一個空字符串responseBody。

websocketRequest.onMessage = function(response) { 

    // This produces the image in my original question displaying an empty responseJson. Can anyone explain why? 
    console.dir(response); 

    var message = response.responseBody; 
    try { 
    var json = atmosphere.util.parseJSON(message); 
    } catch (e) { 
    console.log('This doesn\'t look like a valid JSON: ', message); 
    return; 
    }  

    console.log(message); 

    $rootScope.$apply(function() { 
    messages.push(message); 
    }); 
};