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