package com.epam.cisen.core.api.core; import java.util.HashMap; import java.util.Map; import org.apache.felix.scr.annotations.Activate; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.ReferenceCardinality; import org.apache.felix.scr.annotations.ReferencePolicy; import org.apache.felix.scr.annotations.Service; import org.osgi.service.component.ComponentContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.epam.cisen.core.api.Connector; @Component(immediate = true) @Service(ConnectorManager.class) @Reference(policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, referenceInterface = Connector.class, bind = "bindConnector", unbind = "unbindConnector") public class ConnectorManager { private static final Logger LOGGER = LoggerFactory.getLogger(ConnectorManager.class); private Map<String, Thread> pool = new HashMap<>(6); @Activate public void activate(ComponentContext componentContext) { LOGGER.info("Activate Connector Mapper"); } protected void bindConnector(Connector connector) { final Thread thread = new Thread(new ConnectorCaller(connector)); thread.start(); pool.put(connector.getClass().getCanonicalName(), thread); } protected void unbindConnector(Connector connector) { final Thread thread = pool.get(connector.getClass().getCanonicalName()); thread.interrupt(); } private static class ConnectorCaller implements Runnable { private Connector messenger; ConnectorCaller(Connector messenger) { this.messenger = messenger; } public void run() { try { while (!Thread.interrupted()) { messenger.check(); Thread.sleep(20000); } } catch (InterruptedException e) { e.printStackTrace(); } } } }