@Singleton @ManagedService(path = "/async/parking/device-changes") public class ParkingDeviceChangeAsyncService implements MessageListener { private final Logger logger = Logger.getLogger(ParkingDeviceChangeAsyncService.class); @Inject @Named("/async/parking/device-changes") private Broadcaster broadcaster; private ObjectMapper mapper; @PostConstruct private void init() { mapper = new ObjectMapper(); try { JmsConnector.getInstance().listenOnDeviceChange(this); } catch (JMSException e) { logger.error(e); } catch (NamingException e) { logger.error(e); } } @Disconnect public void onDisconnect(AtmosphereResourceEvent event) { if (event.isCancelled()) { logger.debug("Browser unexpectedly disconnected, resource UUID: " + event.getResource().uuid()); } else if (event.isClosedByClient()) { logger.debug( "Browser closed the connection by client action, resource UUID: " + event.getResource().uuid()); } } @Message(encoders = { DeviceChangeEncoder.class }) public JsonDeviceChange onPushMessage(JsonDeviceChange changes) { if (changes != null) { try { logger.debug("Recived device change: " + mapper.writeValueAsString(changes)); } catch (JsonProcessingException e) { logger.error(e.getCause()); throw new RuntimeException(e); } return changes; } else { return null; } } @Ready public void onReady(AtmosphereResource resource) { logger.debug("Browser connected, resource UUID: " + resource.uuid()); } @Resume public void onResume(AtmosphereResourceEvent resource) { logger.debug("Browser resumed, resource UUID: " + resource.getResource().uuid()); } @Override public void onMessage(javax.jms.Message message) { JsonDeviceChange change; try { change = (JsonDeviceChange) ((ObjectMessage) message).getObject(); if (broadcaster != null) { broadcaster.broadcast(change); } } catch (JMSException e) { logger.error(e); } } }