From c27f56707191d0790082f9bef5f3055c0ebcdca2 Mon Sep 17 00:00:00 2001 From: jsinovassin Date: Fri, 6 Feb 2026 11:54:04 +0100 Subject: [PATCH 1/2] UNOMI-930: sync startup log display to avoid to see it twice --- .../unomi/lifecycle/BundleWatcherImpl.java | 59 ++++++++++--------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/lifecycle-watcher/src/main/java/org/apache/unomi/lifecycle/BundleWatcherImpl.java b/lifecycle-watcher/src/main/java/org/apache/unomi/lifecycle/BundleWatcherImpl.java index c18ea6e64..55f9799b4 100644 --- a/lifecycle-watcher/src/main/java/org/apache/unomi/lifecycle/BundleWatcherImpl.java +++ b/lifecycle-watcher/src/main/java/org/apache/unomi/lifecycle/BundleWatcherImpl.java @@ -58,6 +58,9 @@ public class BundleWatcherImpl implements SynchronousBundleListener, ServiceList private List serverInfos = new ArrayList<>(); + // Lock object to synchronize startup message display + private final Object startupMessageLock = new Object(); + public void setRequiredBundles(Map requiredBundles) { this.requiredBundles = new ConcurrentHashMap<>(requiredBundles); } @@ -274,43 +277,43 @@ private void destroyScheduler() { } private void checkStartupComplete() { - if (!isStartupComplete()) { - startScheduler(getBundleCheckTask()); - return; - } if (scheduledFuture != null) { destroyScheduler(); } - if (!allAdditionalBundleStarted()) { + if (!isStartupComplete()) { + startScheduler(getBundleCheckTask()); + return; + } else if (!allAdditionalBundleStarted()) { startScheduler(getAdditionalBundleCheckTask()); return; } - if (scheduledFuture != null) { - destroyScheduler(); - } if (!startupMessageAlreadyDisplayed) { - long totalStartupTime = System.currentTimeMillis() - startupTime; + synchronized (startupMessageLock) { + if (!startupMessageAlreadyDisplayed) { + long totalStartupTime = System.currentTimeMillis() - startupTime; - List logoLines = serverInfos.get(serverInfos.size() - 1).getLogoLines(); - if (logoLines != null && !logoLines.isEmpty()) { - logoLines.forEach(System.out::println); + List logoLines = serverInfos.get(serverInfos.size() - 1).getLogoLines(); + if (logoLines != null && !logoLines.isEmpty()) { + logoLines.forEach(System.out::println); + } + System.out.println("--------------------------------------------------------------------------------------------"); + serverInfos.forEach(serverInfo -> { + String versionMessage = MessageFormat.format(" {0} {1} ({2,date,yyyy-MM-dd HH:mm:ssZ} // {3} // {4} // {5}) ", + StringUtils.rightPad(serverInfo.getServerIdentifier(), 12, " "), serverInfo.getServerVersion(), + serverInfo.getServerBuildDate(), serverInfo.getServerTimestamp(), serverInfo.getServerScmBranch(), + serverInfo.getServerBuildNumber()); + System.out.println(versionMessage); + LOGGER.info(versionMessage); + }); + System.out.println("--------------------------------------------------------------------------------------------"); + System.out.println("Server successfully started " + requiredBundles.size() + " bundles and " + requiredServicesFilters.size() + + " required " + "services in " + totalStartupTime + " ms"); + LOGGER.info("Server successfully started {} bundles and {} required services in {} ms", requiredBundles.size(), + requiredServicesFilters.size(), totalStartupTime); + startupMessageAlreadyDisplayed = true; + shutdownMessageAlreadyDisplayed = false; + } } - System.out.println("--------------------------------------------------------------------------------------------"); - serverInfos.forEach(serverInfo -> { - String versionMessage = MessageFormat.format(" {0} {1} ({2,date,yyyy-MM-dd HH:mm:ssZ} // {3} // {4} // {5}) ", - StringUtils.rightPad(serverInfo.getServerIdentifier(), 12, " "), serverInfo.getServerVersion(), - serverInfo.getServerBuildDate(), serverInfo.getServerTimestamp(), serverInfo.getServerScmBranch(), - serverInfo.getServerBuildNumber()); - System.out.println(versionMessage); - LOGGER.info(versionMessage); - }); - System.out.println("--------------------------------------------------------------------------------------------"); - System.out.println("Server successfully started " + requiredBundles.size() + " bundles and " + requiredServicesFilters.size() - + " required " + "services in " + totalStartupTime + " ms"); - LOGGER.info("Server successfully started {} bundles and {} required services in {} ms", requiredBundles.size(), - requiredServicesFilters.size(), totalStartupTime); - startupMessageAlreadyDisplayed = true; - shutdownMessageAlreadyDisplayed = false; } } From a5937e0ed5814eac9f255ecb1f2d61328f570b06 Mon Sep 17 00:00:00 2001 From: jsinovassin Date: Tue, 17 Feb 2026 11:08:40 +0100 Subject: [PATCH 2/2] feedback --- .../java/org/apache/unomi/lifecycle/BundleWatcherImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lifecycle-watcher/src/main/java/org/apache/unomi/lifecycle/BundleWatcherImpl.java b/lifecycle-watcher/src/main/java/org/apache/unomi/lifecycle/BundleWatcherImpl.java index 55f9799b4..c5930ba1e 100644 --- a/lifecycle-watcher/src/main/java/org/apache/unomi/lifecycle/BundleWatcherImpl.java +++ b/lifecycle-watcher/src/main/java/org/apache/unomi/lifecycle/BundleWatcherImpl.java @@ -51,7 +51,7 @@ public class BundleWatcherImpl implements SynchronousBundleListener, ServiceList private long matchedRequiredServicesCount = 0; private BundleContext bundleContext; - private boolean startupMessageAlreadyDisplayed = false; + private volatile boolean startupMessageAlreadyDisplayed = false; private boolean shutdownMessageAlreadyDisplayed = false; private Integer checkStartupStateRefreshInterval = 60; @@ -272,7 +272,7 @@ private void startScheduler(TimerTask timerTask) { } private void destroyScheduler() { - scheduledFuture.cancel(true); + scheduledFuture.cancel(false); scheduledFuture = null; }