diff --git a/github-bot/src/main/java/io/github/martinwitt/laughing_train/mining/AnalyzerResultsPersistence.java b/github-bot/src/main/java/io/github/martinwitt/laughing_train/mining/AnalyzerResultsPersistence.java index 4c6187e30..a7f56e821 100644 --- a/github-bot/src/main/java/io/github/martinwitt/laughing_train/mining/AnalyzerResultsPersistence.java +++ b/github-bot/src/main/java/io/github/martinwitt/laughing_train/mining/AnalyzerResultsPersistence.java @@ -34,13 +34,14 @@ public void start() throws Exception { void persistResults(StoreResults storeResults) { Project project = storeResults.project(); CodeAnalyzerResult result = storeResults.result(); - addOrUpdateCommitHash(project, result, SERVICE_NAME); + addOrUpdateCommitHash(project, result, storeResults.analyzerName()); if (result instanceof CodeAnalyzerResult.Failure failure) { - logger.atInfo().log("Analyzer %s failed for project %s", SERVICE_NAME, project.name()); + logger.atInfo().log("Analyzer %s failed for project %s", storeResults.analyzerName(), project.name()); } else if (result instanceof CodeAnalyzerResult.Success success) { - logger.atInfo().log("Analyzer %s succeeded for project %s", SERVICE_NAME, project.name()); + logger.atInfo().log("Analyzer %s succeeded for project %s", storeResults.analyzerName(), project.name()); } + vertx.eventBus().send(MiningStartup.SERVICE_NAME, storeResults.analyzerName()); } private AnalyzerStatus getAnalyzerStatus(CodeAnalyzerResult spoonResult, String name) { @@ -82,5 +83,6 @@ private void addOrUpdateCommitHash(Project project, CodeAnalyzerResult spoonResu oldProject.addCommitHash(gitHubCommit); projectRepository.save(oldProject); } + vertx.eventBus().send(AnalyzerResultsPersistence.SERVICE_NAME, project); } } diff --git a/github-bot/src/main/java/io/github/martinwitt/laughing_train/mining/MiningStartup.java b/github-bot/src/main/java/io/github/martinwitt/laughing_train/mining/MiningStartup.java index 8edbbb65c..573262558 100644 --- a/github-bot/src/main/java/io/github/martinwitt/laughing_train/mining/MiningStartup.java +++ b/github-bot/src/main/java/io/github/martinwitt/laughing_train/mining/MiningStartup.java @@ -3,17 +3,22 @@ import io.github.martinwitt.laughing_train.mining.requests.MineNextProject; import io.quarkus.logging.Log; import io.quarkus.runtime.StartupEvent; +import io.vertx.core.AbstractVerticle; import io.vertx.core.DeploymentOptions; import io.vertx.core.Future; import io.vertx.core.Vertx; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.event.Observes; import jakarta.inject.Inject; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.TimeUnit; @ApplicationScoped public class MiningStartup { + public static final String SERVICE_NAME = "miningStartup"; + @Inject Vertx vertx; @@ -29,27 +34,53 @@ public class MiningStartup { @Inject SpoonPeriodicMiner spoonPeriodicMiner; + @Inject + MiningEventConsumer miningEventConsumer; + void startup(@Observes StartupEvent event) { DeploymentOptions options = new DeploymentOptions().setWorker(true); Future.join( vertx.deployVerticle(qodanaPeriodicMiner, options), vertx.deployVerticle(spoonPeriodicMiner, options), vertx.deployVerticle(persistence, options), - vertx.deployVerticle(projectSupplier, options)) + vertx.deployVerticle(projectSupplier, options), + vertx.deployVerticle(miningEventConsumer, options)) .onFailure(Throwable::printStackTrace) .onComplete(v -> System.out.println("All verticles deployed")) - .onSuccess(v -> startPeriodicMining()); + .onSuccess(v -> Log.info("Starting periodic mining")); vertx.eventBus().addInboundInterceptor(v -> { System.out.println("Received message: " + v.toString()); v.next(); }); } - private void startPeriodicMining() { - Log.info("Starting periodic mining"); - vertx.setPeriodic(TimeUnit.MINUTES.toMillis(3), TimeUnit.MINUTES.toMillis(25), v -> vertx.eventBus() - .publish("miner", new MineNextProject(QodanaPeriodicMiner.ANALYZER_NAME))); - vertx.setPeriodic(TimeUnit.MINUTES.toMillis(2), TimeUnit.MINUTES.toMillis(15), v -> vertx.eventBus() - .publish("miner", new MineNextProject(SpoonPeriodicMiner.ANALYZER_NAME))); + @ApplicationScoped + private static class MiningEventConsumer extends AbstractVerticle { + + private Map timerIDByAnalyzerName = new HashMap<>(); + + @Override + public void start() throws Exception { + vertx.eventBus().consumer(SERVICE_NAME, v -> startMiningAgain(v.body())); + timerIDByAnalyzerName.put( + QodanaPeriodicMiner.ANALYZER_NAME, + vertx.setPeriodic(TimeUnit.MINUTES.toMillis(3), TimeUnit.MINUTES.toMillis(25), v -> vertx.eventBus() + .publish("miner", new MineNextProject(QodanaPeriodicMiner.ANALYZER_NAME)))); + timerIDByAnalyzerName.put( + SpoonPeriodicMiner.ANALYZER_NAME, + vertx.setPeriodic(TimeUnit.MINUTES.toMillis(2), TimeUnit.MINUTES.toMillis(15), v -> vertx.eventBus() + .publish("miner", new MineNextProject(SpoonPeriodicMiner.ANALYZER_NAME)))); + } + + void startMiningAgain(String analyzerName) { + if (vertx.cancelTimer(timerIDByAnalyzerName.get(analyzerName))) { + timerIDByAnalyzerName.put( + analyzerName, + vertx.setPeriodic( + TimeUnit.MINUTES.toMillis(3), TimeUnit.MINUTES.toMillis(25), v -> vertx.eventBus() + .publish("miner", new MineNextProject(analyzerName)))); + vertx.eventBus().publish("miner", new MineNextProject(analyzerName)); + } + } } }