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.Messenger;
@Component(immediate = true)
@Service(MessengersManager.class)
@Reference(policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, referenceInterface = Messenger.class, bind = "bindMessenger", unbind = "unbindMessenger")
public class MessengersManager {
private static final Logger LOGGER = LoggerFactory.getLogger(MessengersManager.class);
private Map<String, Thread> pool = new HashMap<>(6);
@Activate
public void activate(ComponentContext componentContext) {
LOGGER.info("Activate Messenger Mapper");
}
protected void bindMessenger(Messenger ciMessenger) {
final Thread thread = new Thread(new MessageCaller(ciMessenger));
thread.start();
pool.put(ciMessenger.getClass().getCanonicalName(), thread);
}
protected void unbindMessenger(Messenger ciMessenger) {
final Thread thread = pool.get(ciMessenger.getClass().getCanonicalName());
thread.interrupt();
}
private static class MessageCaller implements Runnable {
private Messenger messenger;
MessageCaller(Messenger messenger) {
this.messenger = messenger;
}
public void run() {
try {
while (!Thread.interrupted()) {
messenger.send();
Thread.sleep(10000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}