package com.megatim.fdxconsultation.service.impl.sockets.helpers; import com.fdx.messaging.common.ConnexionStatut; import com.megatim.fdxconsultation.core.ifaces.supervision.StandaloneServerStateEntityManager; import com.megatim.fdxconsultation.model.supervision.StandaloneServerStateEntity; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import javax.websocket.EncodeException; import javax.websocket.Session; /** * * @author Gabuntu */ @ApplicationScoped public class ConnexionStatutSessionHandler { @Inject StandaloneServerStateEntityManager serverStateManager; private final Map idToSessions = new ConcurrentHashMap<>(); private Timer timer = new Timer(); public void publishMessage(List connectedStatuts) { getSessions().forEach(s -> { try { s.getBasicRemote().sendObject(connectedStatuts); } catch (IOException | EncodeException ex) { Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } }); scheduleTask(); } public void addSession(Session session) { idToSessions.put(session.getId(), session); } public void removeSession(Session session) { idToSessions.remove(session.getId()); } private List getSessions() { return idToSessions .entrySet() .stream() .map(e -> e.getValue()) .collect(Collectors.toList()); } private void scheduleTask() { timer.cancel(); final long lastPublishTime = System.nanoTime(); timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { if (System.nanoTime() - lastPublishTime >= 10_000_000_000L) { StandaloneServerStateEntity stateEntity = serverStateManager.getCurrentStandaloneServerStateEntity(); if (stateEntity != null) { List connectedStatuts = stateEntity.getAgentConfigurations().stream().map(a -> { ConnexionStatut connexionStatut = new ConnexionStatut(); connexionStatut.setAgentCode(a.getAgentCode()); connexionStatut.setConnected(false); return connexionStatut; }).collect(Collectors.toList()); publishMessage(connectedStatuts); } } } }, 0, 5000); } }