com.microsoft.azure.servicebus.primitives.Timer Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of azure-servicebus Show documentation
Show all versions of azure-servicebus Show documentation
Java library for Azure Service Bus. Please note, a newer package com.azure:azure-messaging-servicebus for Azure Service Bus is available as of December 2020. While this package will continue to receive critical bug fixes, we strongly encourage you to upgrade. Read the migration guide at https://aka.ms/azsdk/java/migrate/sb for more details.
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
package com.microsoft.azure.servicebus.primitives;
import java.time.Duration;
import java.util.HashSet;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* An abstraction for a Scheduler functionality - which can later be replaced by a light-weight Thread
*/
public final class Timer {
private static ScheduledExecutorService executor = null;
private static final Logger TRACE_LOGGER = LoggerFactory.getLogger(Timer.class);
private static final HashSet REFERENCES = new HashSet<>();
private static final Object SYNC_REFERENCES = new Object();
private Timer() {
}
// runFrequency implemented only for TimeUnit granularity - Seconds
public static ScheduledFuture> schedule(Runnable runnable, Duration runFrequency, TimerType timerType) {
switch (timerType) {
case OneTimeRun:
return executor.schedule(runnable, runFrequency.toMillis(), TimeUnit.MILLISECONDS);
case RepeatRun:
return executor.scheduleWithFixedDelay(runnable, runFrequency.toMillis(), runFrequency.toMillis(), TimeUnit.MILLISECONDS);
default:
throw new UnsupportedOperationException("Unsupported timer pattern.");
}
}
static void register(final String clientId) {
synchronized (SYNC_REFERENCES) {
if (REFERENCES.size() == 0 && (executor == null || executor.isShutdown())) {
final int corePoolSize = Math.max(Runtime.getRuntime().availableProcessors(), 4);
TRACE_LOGGER.debug("Starting ScheduledThreadPoolExecutor with coreThreadPoolSize:{}", corePoolSize);
executor = Executors.newScheduledThreadPool(corePoolSize);
}
REFERENCES.add(clientId);
}
}
static void unregister(final String clientId) {
synchronized (SYNC_REFERENCES) {
if (REFERENCES.remove(clientId) && REFERENCES.size() == 0 && executor != null) {
TRACE_LOGGER.debug("Shuting down ScheduledThreadPoolExecutor");
executor.shutdownNow();
}
}
}
}