private ExecutorService createPriorityExecutor(ScanExecutorConfig sec,
Map<String,Queue<?>> scanExecQueues) {
BlockingQueue<Runnable> queue;
if (sec.prioritizerClass.orElse("").isEmpty()) {
queue = new LinkedBlockingQueue<>();
} else {
ScanPrioritizer factory = null;
try {
factory = ConfigurationTypeHelper.getClassInstance(null, sec.prioritizerClass.get(),
ScanPrioritizer.class);
} catch (Exception e) {
throw new RuntimeException(e);
}
if (factory == null) {
queue = new LinkedBlockingQueue<>();
} else {
Comparator<ScanInfo> comparator = factory.createComparator(() -> sec.prioritizerOpts);
Function<Runnable,ScanInfo> extractor = r -> ((ScanSession.ScanMeasurer) ((TraceRunnable) r)
.getRunnable()).getScanInfo();
queue = new PriorityBlockingQueue<>(sec.maxThreads,
Comparator.comparing(extractor, comparator));
}
}
scanExecQueues.put(sec.name, queue);
return createEs(() -> sec.getCurrentMaxThreads(), "scan-" + sec.name, queue, sec.priority);
}