package org.lightfish.business.heartbeat.boundary; import java.io.IOException; import java.io.StringWriter; import java.util.concurrent.CopyOnWriteArraySet; import javax.annotation.PostConstruct; import javax.ejb.ConcurrencyManagement; import javax.ejb.ConcurrencyManagementType; import javax.ejb.Singleton; import javax.enterprise.event.Observes; import javax.inject.Inject; import javax.websocket.OnClose; import javax.websocket.OnOpen; import javax.websocket.RemoteEndpoint; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; import org.lightfish.business.heartbeat.control.Serializer; import org.lightfish.business.logging.Log; import org.lightfish.business.servermonitoring.boundary.Severity; import org.lightfish.business.servermonitoring.entity.Snapshot; /** * @author: adam-bien.com */ @Singleton @ServerEndpoint("/snapshots/") @ConcurrencyManagement(ConcurrencyManagementType.BEAN) public class SnapshotsSocket { @Inject Log LOG; @Inject Serializer serializer; private CopyOnWriteArraySet<Session> sessions; @PostConstruct public void init() { this.sessions = new CopyOnWriteArraySet<>(); } @OnOpen public void onOpen(Session session) { this.sessions.add(session); } @OnClose public void onClose(Session session) { this.sessions.remove(session); } public void onNewSnapshot(@Observes @Severity(Severity.Level.HEARTBEAT) Snapshot snapshot) { LOG.info("SnapshotsSocket.oneNewSnapshot: " + snapshot.getId()); for (Session session : sessions) { if (session != null && session.isOpen()) { LOG.info("Sending: " + snapshot.getId() + " to " + session.getId()); StringWriter writer = new StringWriter(); this.serializer.serialize(snapshot, writer); try { final RemoteEndpoint.Basic remote = session.getBasicRemote(); remote.sendText(writer.getBuffer().toString()); } catch (IOException ex) { LOG.error("Problem sending Snapshot", ex); } } } } }