import static org.openhab.binding.miio.internal.MiIoBindingConstants.*;
import java.util.Map;
+import java.util.concurrent.Future;
+import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.ScheduledExecutorService;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.thing.type.ChannelTypeRegistry;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Reference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* The {@link MiIoHandlerFactory} is responsible for creating things and thing
private static final String THING_HANDLER_THREADPOOL_NAME = "thingHandler";
protected final ScheduledExecutorService scheduler = ThreadPoolManager
.getScheduledPool(THING_HANDLER_THREADPOOL_NAME);
-
private MiIoDatabaseWatchService miIoDatabaseWatchService;
private CloudConnector cloudConnector;
private ChannelTypeRegistry channelTypeRegistry;
private BasicChannelTypeProvider basicChannelTypeProvider;
+ private @Nullable Future<Boolean> scheduledTask;
+ private final Logger logger = LoggerFactory.getLogger(MiIoHandlerFactory.class);
@Activate
public MiIoHandlerFactory(@Reference ChannelTypeRegistry channelTypeRegistry,
@Reference MiIoDatabaseWatchService miIoDatabaseWatchService, @Reference CloudConnector cloudConnector,
@Reference BasicChannelTypeProvider basicChannelTypeProvider, Map<String, Object> properties) {
this.miIoDatabaseWatchService = miIoDatabaseWatchService;
+ this.channelTypeRegistry = channelTypeRegistry;
+ this.basicChannelTypeProvider = basicChannelTypeProvider;
this.cloudConnector = cloudConnector;
@Nullable
String username = (String) properties.get("username");
@Nullable
String country = (String) properties.get("country");
cloudConnector.setCredentials(username, password, country);
- scheduler.submit(() -> cloudConnector.isConnected());
- this.channelTypeRegistry = channelTypeRegistry;
- this.basicChannelTypeProvider = basicChannelTypeProvider;
+ try {
+ if (!scheduler.isShutdown()) {
+ scheduledTask = scheduler.submit(() -> cloudConnector.isConnected());
+ } else {
+ logger.debug("Unexpected: ScheduledExecutorService is shutdown.");
+ }
+ } catch (RejectedExecutionException e) {
+ logger.debug("Unexpected: ScheduledExecutorService task rejected.", e);
+ }
+ }
+
+ @Deactivate
+ private void dispose() {
+ final Future<Boolean> scheduledTask = this.scheduledTask;
+ if (scheduledTask != null && !scheduledTask.isDone()) {
+ scheduledTask.cancel(true);
+ }
}
@Override