2016-06-13 7 views
0

Ich verwende Spring-Boot (eingebetteter Container) mit Atmosphere Framework basierend auf diesen one und two Beispielprojekten.Atmosphere Framework Websocket gibt leer responseBody zurück

Ich versuche, eine sehr einfache Sendung von einer Ressource zu tun, der Browser empfängt die Nachricht, aber die responseBody ist leere Zeichenfolge "". Ich habe einen Großteil des Atmosphere-Codes getestet und von dem, was ich sagen kann, wurde meine JSON-Nachricht erfolgreich zur asynchronen Schreibwarteschlange hinzugefügt, aber sie bleibt im Browser leer.

Ich dachte zuerst könnte es sein, dass Atmosphäre die Nachricht ausfiltert, aber das Debuggen zeigt, dass es nicht ist.

enter image description here

Relevante 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> 

Relevante TRACE Log:

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]} 

Atmosphäre Konfiguration

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); 
    } 

} 

Atmosphäre Ressourcen

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")); 
    } 

} 

Stelle, bei der ich emittieren Nachrichten

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));   
     } 

    } 

} 

Antwort

0

Ich kann ich nicht diese früher nicht glauben versuchen, aber die JSON gibt es eigentlich in der responseBody wird in der Konsole nicht angezeigt, wenn es mit console.dir eingeloggt ist !!

Ich weiß nicht, warum console.dir (Antwort) zeigt eine leere Zeichenfolge responseBody obwohl.

Verwandte Themen