package cc.blynk.server.launcher;
import cc.blynk.server.Holder;
import cc.blynk.server.core.BaseServer;
import cc.blynk.server.core.reporting.average.AverageAggregatorProcessor;
import cc.blynk.server.workers.*;
import cc.blynk.utils.ReportingUtil;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* Launches a bunch of separate jobs/schedulers responsible for different aspects of business logic
*
* The Blynk Project.
* Created by Dmitriy Dumanskiy.
* Created on 28.09.15.
*/
class JobLauncher {
public static void start(Holder holder, BaseServer[] servers) {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
long startDelay;
ReportingWorker reportingWorker = new ReportingWorker(
holder.reportingDao,
ReportingUtil.getReportingFolder(holder.props.getProperty("data.folder")),
holder.dbManager
);
//to start at the beggining of an minute
startDelay = AverageAggregatorProcessor.MINUTE - (System.currentTimeMillis() % AverageAggregatorProcessor.MINUTE);
scheduler.scheduleAtFixedRate(reportingWorker, startDelay, AverageAggregatorProcessor.MINUTE, TimeUnit.MILLISECONDS);
ProfileSaverWorker profileSaverWorker = new ProfileSaverWorker(holder.userDao, holder.fileManager, holder.dbManager);
//running 1 sec later after reporting
scheduler.scheduleAtFixedRate(profileSaverWorker, startDelay + 1000,
holder.props.getIntProperty("profile.save.worker.period"), TimeUnit.MILLISECONDS);
StatsWorker statsWorker = new StatsWorker(holder);
scheduler.scheduleAtFixedRate(statsWorker, 1000,
holder.props.getIntProperty("stats.print.worker.period"), TimeUnit.MILLISECONDS);
if (holder.sslContextHolder.isAutoGenerationEnabled) {
scheduler.scheduleAtFixedRate(
new CertificateRenewalWorker(holder.sslContextHolder.acmeClient, 7), 1, 1, TimeUnit.DAYS
);
}
//millis we need to wait to start scheduler at the beginning of a second.
startDelay = 1000 - (System.currentTimeMillis() % 1000);
//separate thread for timer and reading widgets
ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
ses.scheduleAtFixedRate(holder.timerWorker, startDelay, 1000, TimeUnit.MILLISECONDS);
ses.scheduleAtFixedRate(holder.readingWidgetsWorker, startDelay + 400, 1000, TimeUnit.MILLISECONDS);
//shutdown hook thread catcher
Runtime.getRuntime().addShutdownHook(new Thread(
new ShutdownHookWorker(servers, holder, scheduler, profileSaverWorker)
));
}
}