From 247495335e7c41e4a0edd753b152ad54d70f27de Mon Sep 17 00:00:00 2001 From: Jeremy Date: Sun, 2 Feb 2025 14:20:19 -0500 Subject: [PATCH] [insteon] Use separate pool for long running threads (#18147) Signed-off-by: Jeremy Setton --- .../internal/handler/InsteonBaseThingHandler.java | 3 +-- .../internal/handler/InsteonBridgeHandler.java | 15 +++++++++------ .../handler/InsteonLegacyNetworkHandler.java | 8 +++++++- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/bundles/org.openhab.binding.insteon/src/main/java/org/openhab/binding/insteon/internal/handler/InsteonBaseThingHandler.java b/bundles/org.openhab.binding.insteon/src/main/java/org/openhab/binding/insteon/internal/handler/InsteonBaseThingHandler.java index a6c190fd72a..9c220ac834d 100644 --- a/bundles/org.openhab.binding.insteon/src/main/java/org/openhab/binding/insteon/internal/handler/InsteonBaseThingHandler.java +++ b/bundles/org.openhab.binding.insteon/src/main/java/org/openhab/binding/insteon/internal/handler/InsteonBaseThingHandler.java @@ -370,9 +370,8 @@ public abstract class InsteonBaseThingHandler extends BaseThingHandler implement } protected void cancelJob(@Nullable ScheduledFuture job, boolean interrupt) { - if (job != null) { + if (job != null && !job.isCancelled()) { job.cancel(interrupt); - job = null; } } } diff --git a/bundles/org.openhab.binding.insteon/src/main/java/org/openhab/binding/insteon/internal/handler/InsteonBridgeHandler.java b/bundles/org.openhab.binding.insteon/src/main/java/org/openhab/binding/insteon/internal/handler/InsteonBridgeHandler.java index 2567296a64e..81af5995a5a 100644 --- a/bundles/org.openhab.binding.insteon/src/main/java/org/openhab/binding/insteon/internal/handler/InsteonBridgeHandler.java +++ b/bundles/org.openhab.binding.insteon/src/main/java/org/openhab/binding/insteon/internal/handler/InsteonBridgeHandler.java @@ -15,6 +15,7 @@ package org.openhab.binding.insteon.internal.handler; import static org.openhab.binding.insteon.internal.InsteonBindingConstants.*; import java.util.Optional; +import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.stream.Stream; @@ -33,6 +34,7 @@ import org.openhab.binding.insteon.internal.device.InsteonAddress; import org.openhab.binding.insteon.internal.device.InsteonModem; import org.openhab.binding.insteon.internal.device.ProductData; import org.openhab.binding.insteon.internal.discovery.InsteonDiscoveryService; +import org.openhab.core.common.ThreadPoolManager; import org.openhab.core.io.transport.serial.SerialPortManager; import org.openhab.core.storage.Storage; import org.openhab.core.storage.StorageService; @@ -58,6 +60,9 @@ public class InsteonBridgeHandler extends InsteonBaseThingHandler implements Bri private static final int RETRY_INTERVAL = 30; // seconds private static final int START_DELAY = 5; // seconds + private final ScheduledExecutorService insteonScheduler = ThreadPoolManager + .getScheduledPool(BINDING_ID + "-" + getThingId()); + private @Nullable InsteonModem modem; private @Nullable InsteonDiscoveryService discoveryService; private @Nullable ScheduledFuture connectJob; @@ -167,7 +172,7 @@ public class InsteonBridgeHandler extends InsteonBaseThingHandler implements Bri legacyHandler.disable(); } - InsteonModem modem = InsteonModem.makeModem(this, config, httpClient, scheduler, serialPortManager); + InsteonModem modem = InsteonModem.makeModem(this, config, httpClient, insteonScheduler, serialPortManager); this.modem = modem; if (isInitialized()) { @@ -314,8 +319,9 @@ public class InsteonBridgeHandler extends InsteonBaseThingHandler implements Bri return; } - cancelJob(reconnectJob, false); updateStatus(); + + cancelJob(reconnectJob, false); }, 0, RETRY_INTERVAL, TimeUnit.SECONDS); } @@ -327,10 +333,7 @@ public class InsteonBridgeHandler extends InsteonBaseThingHandler implements Bri updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.DUTY_CYCLE, "Resetting bridge."); - resetJob = scheduler.schedule(() -> { - initialize(); - cancelJob(resetJob, false); - }, delay, TimeUnit.SECONDS); + resetJob = scheduler.schedule(this::initialize, delay, TimeUnit.SECONDS); }); } diff --git a/bundles/org.openhab.binding.insteon/src/main/java/org/openhab/binding/insteon/internal/handler/InsteonLegacyNetworkHandler.java b/bundles/org.openhab.binding.insteon/src/main/java/org/openhab/binding/insteon/internal/handler/InsteonLegacyNetworkHandler.java index 6e70a241dd5..f04695ad452 100644 --- a/bundles/org.openhab.binding.insteon/src/main/java/org/openhab/binding/insteon/internal/handler/InsteonLegacyNetworkHandler.java +++ b/bundles/org.openhab.binding.insteon/src/main/java/org/openhab/binding/insteon/internal/handler/InsteonLegacyNetworkHandler.java @@ -16,18 +16,21 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jetty.client.HttpClient; +import org.openhab.binding.insteon.internal.InsteonBindingConstants; import org.openhab.binding.insteon.internal.InsteonLegacyBinding; import org.openhab.binding.insteon.internal.config.InsteonBridgeConfiguration; import org.openhab.binding.insteon.internal.config.InsteonLegacyNetworkConfiguration; import org.openhab.binding.insteon.internal.device.DeviceAddress; import org.openhab.binding.insteon.internal.device.InsteonAddress; import org.openhab.binding.insteon.internal.discovery.InsteonLegacyDiscoveryService; +import org.openhab.core.common.ThreadPoolManager; import org.openhab.core.io.console.Console; import org.openhab.core.io.transport.serial.SerialPortManager; import org.openhab.core.thing.Bridge; @@ -61,6 +64,9 @@ public class InsteonLegacyNetworkHandler extends BaseBridgeHandler { private final Logger logger = LoggerFactory.getLogger(InsteonLegacyNetworkHandler.class); + private final ScheduledExecutorService insteonScheduler = ThreadPoolManager + .getScheduledPool(InsteonBindingConstants.BINDING_ID + "-" + getThing().getUID().getId()); + private @Nullable InsteonLegacyBinding insteonBinding; private @Nullable InsteonLegacyDiscoveryService insteonDiscoveryService; private @Nullable ScheduledFuture driverInitializedJob = null; @@ -108,7 +114,7 @@ public class InsteonLegacyNetworkHandler extends BaseBridgeHandler { return; } - insteonBinding = new InsteonLegacyBinding(this, config, httpClient, scheduler, serialPortManager); + insteonBinding = new InsteonLegacyBinding(this, config, httpClient, insteonScheduler, serialPortManager); updateStatus(ThingStatus.UNKNOWN); // hold off on starting to poll until devices that already are defined as things are added.