Трансляция атмосферы не получена клиентом JavaScript, нормальная запись работает нормально - PullRequest
0 голосов
/ 05 ноября 2018

У меня Atmosphere работает на стороне сервера в приложении Spring. Проблема в том, что я могу получать обычные сообщения, но не широковещательные сообщения.

Атмосфера была "введена" в загрузку Spring через конфиг.

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

@Bean
public ServletRegistrationBean atmosphereServlet() {
    return new ServletRegistrationBean(
            atmosphereServletNative(), "/atmosphere/*"
    );
}

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

@Bean
public AsyncNotificationService asyncNotificationService() {
    return new AsyncNotificationService();
}

Таким образом, AtmosphereServlet инициализируется в Spring Boot, обрабатывает запросы на /atmosphere/*, а Spring обрабатывает все остальные запросы.

Теперь я хочу транслировать события некоторым клиентам. У меня есть обработчик для этого.

@AtmosphereHandlerService(path = "/atmosphere/webAsync", interceptors = {
        AtmosphereResourceLifecycleInterceptor.class,
        BroadcastOnPostAtmosphereInterceptor.class,
        HeartbeatInterceptor.class,
})
public class AsyncNotificationService implements AtmosphereHandler  {

    Logger logger = LoggerFactory.getLogger(AsyncNotificationService.class);

    private @Autowired AtmosphereFramework atmosphereFramework;

    public void notifyReservationChanged() {
        atmosphereFramework.getBroadcasterFactory().lookupAll().forEach((broadcaster) -> {
            broadcaster.broadcast("RESERVATION_UPDATE");
        });
    }


    @Override
    public void onRequest(AtmosphereResource atmosphereResource) throws IOException {
        Broadcaster broadcaster = atmosphereFramework.getBroadcasterFactory().lookup("webClientBroadcaster", true);
        broadcaster.addAtmosphereResource(atmosphereResource);
        atmosphereResource.setBroadcaster(broadcaster);
        atmosphereResource.suspend();
    }

    @Override
    public void onStateChange(AtmosphereResourceEvent atmosphereResourceEvent) throws IOException {
        logger.debug(atmosphereResourceEvent.toString());
    }

    @Override
    public void destroy() {

    }
}

Таким образом, клиент не получает трансляции. Но когда я делаю это в notifyReservationChanged, я получаю события.

public void notifyReservationChanged() {
    atmosphereFramework.getBroadcasterFactory().lookupAll().forEach((broadcaster) -> {
        broadcaster.getAtmosphereResources().forEach((res) -> {
            res.write("UPDATE_RESERVATION");
        });
    });
}

Что может быть причиной этого? Неправильная конфигурация?

...