public void notify(User user, Event event){ Broadcaster b = BroadcasterFactory.getDefault().lookup(user.getId()); if (b!=null){ b.broadcast(event); } }
@RequestMapping(value = "/user-notifications/{userId}") @ResponseStatus(HttpStatus.OK) @ResponseBody public void watch(@PathVariable("userId") String userId, HttpServletRequest request) throws Exception { //Atmosphere framework puts filter/servlet that adds ATMOSPHERE_RESOURCE to all requests AtmosphereResource resource = (AtmosphereResource)request.getAttribute(ApplicationConfig.ATMOSPHERE_RESOURCE); //suspending resource to keep connection resource.suspend(); //find broadcaster, second parameter says to create broadcaster if it doesn't exist Broadcaster broadcaster = BroadcasterFactory.getDefault().lookup(userId,true); //saving resource for notifications broadcaster.addAtmosphereResource(resource); }
throw new WebApplicationException(authorizationException); if (feed.getAtmosphereResources().size() == 0) { final Future<?> future = feed.scheduleFixedBroadcast(new Callable<String>() { futures.put(tagid, future);
AtmosphereFramework atmosphereFramework = config.framework(); .getAttribute(FrameworkConfig.ATMOSPHERE_RESOURCE); newBroadcaster = config.getBroadcasterFactory().lookup(broadcasterName, true); newBroadcaster.setBroadcasterLifeCyclePolicy(BroadcasterLifeCyclePolicy.EMPTY_DESTROY); r.setBroadcaster(bcaster); executeSuspend(r, timeout, resumeOnBroadcast, null, request, response, writeEntity); } else { Object entity = response.getEntity(); if (waitForResource) { bcaster.awaitAndBroadcast(entity, 30, TimeUnit.SECONDS); } else { bcaster.broadcast(entity); throw new IllegalStateException(e.getMessage()); broadcaster = config.getBroadcasterFactory().lookup(c, topic, true); r = resumeCandidates.remove(path.substring(path.lastIndexOf("/") + 1)); throw new IllegalStateException(e.getMessage()); r.setBroadcaster(config.getBroadcasterFactory().lookup(c, topic, true)); b.scheduleFixedBroadcast(o, waitFor, timeout, TimeUnit.SECONDS); break;
public final static void broadcast(final AtmosphereResource r, final AtmosphereResourceEvent e, final Broadcaster broadcaster) { AtmosphereRequest request = r.getRequest(); ContainerResponse cr = null; if (cr == null || !r.isSuspended() && !r.getAtmosphereResourceEvent().isResumedOnTimeout()) { if (cr == null) { logger.warn("Unexpected state. ContainerResponse has been resumed. Caching message {} for {}", m = r.getAtmosphereConfig().getInitParameter(ApplicationConfig.SSE_CONTENT_TYPE); if (m == null) { m = "text/plain"; logger.trace("Unexpected exception for AtmosphereResource {} and Broadcaster {}", r.uuid(), broadcaster.getID()); if (isJetty(r)) { for (StackTraceElement element : t.getStackTrace()) { if (uuid != null) { if (request.getAttribute(AtmosphereFilter.RESUME_CANDIDATES) != null) { ((ConcurrentHashMap<String, AtmosphereResource>) request.getAttribute(AtmosphereFilter.RESUME_CANDIDATES)).remove(uuid);
/** * Every time a message gets broadcasted, make sure we update the cluster. * * @param o the message to broadcast. * @return The same message. */ @Override public BroadcastAction filter(String broadcasterId, Object originalMessage, Object o) { if (o instanceof String) { String message = (String) o; // Avoid re-broadcasting if (!receivedMessages.remove(message)) { try { String id = bc.getID(); if (id.startsWith("/*")) { id = "atmosphere"; } TextMessage textMessage = session.createTextMessage(message.toString()); textMessage.setStringProperty("BroadcasterId", id); publisher.send(textMessage); } catch (JMSException ex) { logger.warn("failed to publish message", ex); } } return new BroadcastAction(message); } else { return new BroadcastAction(o); } }
private void post(AtmosphereResource resource, PageKey pageKey, Collection<EventSubscription> subscriptionsForPage, AtmosphereEvent event) { String filterPath = WebApplication.get() .getWicketFilter() .getFilterConfig() .getInitParameter(WicketFilter.FILTER_MAPPING_PARAM); filterPath = filterPath.substring(1, filterPath.length() - 1); HttpServletRequest httpRequest = new HttpServletRequestWrapper(resource.getRequest()) { @Override public String getContextPath() { String ret = super.getContextPath(); return ret == null ? "" : ret; } }; AtmosphereWebRequest request = new AtmosphereWebRequest( (ServletWebRequest)application.newWebRequest(httpRequest, filterPath), pageKey, subscriptionsForPage, event); Response response = new AtmosphereWebResponse(resource.getResponse()); if (application.createRequestCycle(request, response).processRequestAndDetach()) broadcaster.broadcast(response.toString(), resource); }
public void onRequest(final AtmosphereResource ar) throws IOException { logger.info("Connecting to comet with: " + ar.getRequest().getRequestURI()); Broadcaster broadcaster = BroadcasterFactory.getDefault().lookup( YOUR_CLIENT_ID, true); if (broadcaster.getAtmosphereResources().size() > 0) { logger.debug("Broadcaster recovered with name: " + broadcaster.getID()); } else { logger.debug("Broadcaster created with name: " + broadcaster.getID()); ar.setBroadcaster(broadcaster); ar.setSerializer(new Serializer() { Charset charset = Charset.forName(ar.getResponse() .getCharacterEncoding());
ensureInitialized(resource); CurrentUser.setUserInLogMappedDiagnosticContexts(resource.getRequest()); try { Counter requestsCounter = requestsCounters.get(resource.transport()); if (requestsCounter == null) { LOGGER.error("unexpected transport: " + resource.transport()); } else { requestsCounter.inc(); } else if (request.getMethod().equalsIgnoreCase("POST")) { LOGGER.debug("onRequest() POST: %s", requestData); resource.getBroadcaster().broadcast(requestData);
public void onRequest(final AtmosphereResource resource) throws IOException { final AtmosphereRequest request = resource.getRequest(); String method = request.getMethod(); resource.getBroadcaster().getBroadcasterConfig().addFilter(injectEndpoint ? onPerMessageFilter : onMessageFilter); resource.addEventListener(new AtmosphereResourceEventListenerAdapter() { @Override public void onSuspend(AtmosphereResourceEvent event) { resource.getBroadcaster().broadcast(o);
/** * Sends the given message to the current client. Cannot be called if * {@isConnected()} is false. * * @param message * The message to send */ protected void sendMessage(String message) { assert (isConnected()); // "Broadcast" the changes to the single client only outgoingMessage = getResource().getBroadcaster().broadcast(message, getResource()); }
public boolean sendNotification(String topicName, String message) throws IOException { BroadcasterFactory broadcasterFactory = framework.getBroadcasterFactory(); Broadcaster b = broadcasterFactory.lookup(Notifications.BASE_PATH + topicName); if(b != null) { b.broadcast(message); return true; } else { return false; } }
@Ready public void onReady(final AtmosphereResource resource) throws IOException { log.info("[websocket] Client {} connected to build {}", resource.uuid(), resource.getBroadcaster().getID()); java.util.UUID buildId = BuildSerializer.uuidFromString(resource.getBroadcaster().getID()); if (build == null || build.getId() == null) { build = hub.getOrCreateBuild(buildId); } else { if (!build.getId().equals(buildId)) { log.debug("[websocket] this should never happen, no ? build.uuid {} !~= {} resource.getBroadcaster().getID", buildId, resource.getBroadcaster().getID()); } } }
@Disconnect public final void onDisconnect(final AtmosphereResourceEvent event){ Collection<AtmosphereResource> atmosphereResources = event.getResource().getBroadcaster().getAtmosphereResources(); if (atmosphereResources.size() < 2 && subscription != null) { synchronized (subscription) { subscription.unsubscribe(); subscription = null; } LOG.debug("[websocket {}] [broadcaster:#{}] unsubscribed !", scopeAsAString, event.getResource().getBroadcaster().getID()); } if (event.isCancelled()) { LOG.info("[websocket {}] Client {} cancelled the connection", scopeAsAString, event.getResource().uuid()); } else if(event.isClosedByClient()) { LOG.info("[websocket {}] Client {} closed the connection", scopeAsAString, event.getResource().uuid()); } }
@Override public void onSuspend(AtmosphereResource resource) { AtmosphereRequest req = resource.getRequest(); String when = req.getParameter("when"); if (when.equals("open")) { resource.resume(); onOpen(); } else if (when.equals("poll")) { this.broadcaster.addAtmosphereResource(resource); retrieveCache(req.getParameter("lastEventIds")); } }
@Override public String getID() { return bc.getID(); }
try { List<Broadcaster> broadcasters = new LinkedList<>(broadcasterFactory.getBroadcasterFactory() .lookupAll()); logger.trace("Publishing all players changed to " + broadcasters.size() + " players."); broadcasters.forEach(broadcaster -> { try { logger.trace("Looking up player for feed " + broadcaster.getID()); String playerId = broadcaster.getID().replace(LiveFeedService.PATH_ROOT, ""); message.setMessageType(MessageType.Player); message.setPlayer(optional.get()); broadcaster.broadcast(message); "Failed to notify broadcaster for all player changed " + broadcaster.getID(), e);
@Disconnect public void onDisconnect(AtmosphereResourceEvent event) throws IOException { if (writeOnClose.get() && build != null && !build.isReadonly()) { UUID buildId = build.getId(); String eventKey = "written"; String eventValue = buildId.toString(); try { hub.writeBuild(build); log.info("[websocket] written build {}", buildId); } catch (IOException e) { eventKey = e.getClass().getSimpleName(); eventValue = e.getMessage(); log.info("[websocket] exception writing build {}, {} : {}", buildId, eventKey, eventValue); } event.broadcaster().broadcast(new Event(eventKey, eventValue, null)); } final String cause; if (event.isCancelled()) { cause = "cancelled"; } else if (event.isClosedByApplication()) { cause = "closedByAppplication"; } else if (event.isClosedByClient()) { cause = "closedByClient"; } else { cause = "unknown"; } log.info("[websocket] Client {} disconnected, cause: {}, buildId: {}, writeOnClose: {}", event.getResource().uuid(), cause, build == null ? null : build.getId(), writeOnClose); }
private void delayBatchBroadcast(final AtmosphereResource r, Long delay) { String uuid = r.uuid(); r.getBroadcaster().getBroadcasterConfig().getScheduledExecutorService().schedule(new Runnable() { @Override public void run() { synchronized (getMutex(uuid)) { List<JSONObject> messages = messagesForUuid.get(uuid); if (messages != null) { JSONObject batchMessage = new JSONObject(); JSONArray jsonMessages = new JSONArray(messages); batchMessage.put("data", jsonMessages); batchMessage.put("type", "batch"); r.getBroadcaster().broadcast(batchMessage.toString(), r); broadcastScheduledForUuid.remove(uuid); messages.clear(); } } } }, delay, TimeUnit.MILLISECONDS); broadcastScheduledForUuid.put(uuid, true); }