У меня 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");
});
});
}
Что может быть причиной этого? Неправильная конфигурация?