[remoteopenhab] Detect a remote server shutdown and reconnect properly (#10060)
when the remote server is alive again Related to #9680 Signed-off-by: Laurent Garnier <lg.hc@free.fr>
This commit is contained in:
parent
f4c2769552
commit
3e7ecbf79c
@ -183,7 +183,7 @@ public class RemoteopenhabBridgeHandler extends BaseBridgeHandler
|
|||||||
@Override
|
@Override
|
||||||
public void dispose() {
|
public void dispose() {
|
||||||
logger.debug("Disposing remote openHAB handler for bridge {}", getThing().getUID());
|
logger.debug("Disposing remote openHAB handler for bridge {}", getThing().getUID());
|
||||||
stopStreamingUpdates();
|
stopStreamingUpdates(false);
|
||||||
stopCheckConnectionJob();
|
stopCheckConnectionJob();
|
||||||
channelsLastStates.clear();
|
channelsLastStates.clear();
|
||||||
}
|
}
|
||||||
@ -380,7 +380,8 @@ public class RemoteopenhabBridgeHandler extends BaseBridgeHandler
|
|||||||
if (localCheckConnectionJob == null || localCheckConnectionJob.isCancelled()) {
|
if (localCheckConnectionJob == null || localCheckConnectionJob.isCancelled()) {
|
||||||
checkConnectionJob = scheduler.scheduleWithFixedDelay(() -> {
|
checkConnectionJob = scheduler.scheduleWithFixedDelay(() -> {
|
||||||
long millisSinceLastEvent = System.currentTimeMillis() - restClient.getLastEventTimestamp();
|
long millisSinceLastEvent = System.currentTimeMillis() - restClient.getLastEventTimestamp();
|
||||||
if (aliveInterval == 0 || restClient.getLastEventTimestamp() == 0) {
|
if (getThing().getStatus() != ThingStatus.ONLINE || aliveInterval == 0
|
||||||
|
|| restClient.getLastEventTimestamp() == 0) {
|
||||||
logger.debug("Time to check server accessibility");
|
logger.debug("Time to check server accessibility");
|
||||||
checkConnection();
|
checkConnection();
|
||||||
} else if (millisSinceLastEvent > (aliveInterval * 60000)) {
|
} else if (millisSinceLastEvent > (aliveInterval * 60000)) {
|
||||||
@ -421,8 +422,12 @@ public class RemoteopenhabBridgeHandler extends BaseBridgeHandler
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void stopStreamingUpdates() {
|
private void stopStreamingUpdates() {
|
||||||
|
stopStreamingUpdates(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void stopStreamingUpdates(boolean waitingForCompletion) {
|
||||||
synchronized (restClient) {
|
synchronized (restClient) {
|
||||||
restClient.stop();
|
restClient.stop(waitingForCompletion);
|
||||||
restClient.removeStreamingDataListener(this);
|
restClient.removeStreamingDataListener(this);
|
||||||
restClient.removeItemsDataListener(this);
|
restClient.removeItemsDataListener(this);
|
||||||
}
|
}
|
||||||
@ -437,6 +442,11 @@ public class RemoteopenhabBridgeHandler extends BaseBridgeHandler
|
|||||||
updateStatus(ThingStatus.ONLINE);
|
updateStatus(ThingStatus.ONLINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDisconnected() {
|
||||||
|
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, "Disconected from the remote server");
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onError(String message) {
|
public void onError(String message) {
|
||||||
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, message);
|
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, message);
|
||||||
|
|||||||
@ -24,10 +24,15 @@ import org.openhab.binding.remoteopenhab.internal.rest.RemoteopenhabRestClient;
|
|||||||
public interface RemoteopenhabStreamingDataListener {
|
public interface RemoteopenhabStreamingDataListener {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The client successfully established a connection.
|
* The client successfully established a connection and received a first event.
|
||||||
*/
|
*/
|
||||||
void onConnected();
|
void onConnected();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The client was disconnected.
|
||||||
|
*/
|
||||||
|
void onDisconnected();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An error message was published.
|
* An error message was published.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -90,6 +90,7 @@ public class RemoteopenhabRestClient {
|
|||||||
private String accessToken;
|
private String accessToken;
|
||||||
private boolean trustedCertificate;
|
private boolean trustedCertificate;
|
||||||
private boolean connected;
|
private boolean connected;
|
||||||
|
private boolean completed;
|
||||||
|
|
||||||
private @Nullable SseEventSource eventSource;
|
private @Nullable SseEventSource eventSource;
|
||||||
private long lastEventTimestamp;
|
private long lastEventTimestamp;
|
||||||
@ -237,10 +238,10 @@ public class RemoteopenhabRestClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void stop() {
|
public void stop(boolean waitingForCompletion) {
|
||||||
synchronized (startStopLock) {
|
synchronized (startStopLock) {
|
||||||
logger.debug("Closing EventSource");
|
logger.debug("Closing EventSource");
|
||||||
closeEventSource(0, TimeUnit.SECONDS);
|
closeEventSource(waitingForCompletion);
|
||||||
logger.debug("EventSource stopped");
|
logger.debug("EventSource stopped");
|
||||||
lastEventTimestamp = 0;
|
lastEventTimestamp = 0;
|
||||||
}
|
}
|
||||||
@ -263,7 +264,7 @@ public class RemoteopenhabRestClient {
|
|||||||
.register(new RemoteopenhabStreamingRequestFilter(accessToken)).build();
|
.register(new RemoteopenhabStreamingRequestFilter(accessToken)).build();
|
||||||
}
|
}
|
||||||
SseEventSource eventSource = eventSourceFactory.newSource(client.target(restSseUrl));
|
SseEventSource eventSource = eventSourceFactory.newSource(client.target(restSseUrl));
|
||||||
eventSource.register(this::onEvent, this::onError);
|
eventSource.register(this::onEvent, this::onError, this::onComplete);
|
||||||
return eventSource;
|
return eventSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -279,7 +280,7 @@ public class RemoteopenhabRestClient {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
closeEventSource(10, TimeUnit.SECONDS);
|
closeEventSource(true);
|
||||||
|
|
||||||
logger.debug("Opening new EventSource {}", url);
|
logger.debug("Opening new EventSource {}", url);
|
||||||
SseEventSource localEventSource = createEventSource(url);
|
SseEventSource localEventSource = createEventSource(url);
|
||||||
@ -288,12 +289,12 @@ public class RemoteopenhabRestClient {
|
|||||||
eventSource = localEventSource;
|
eventSource = localEventSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void closeEventSource(long timeout, TimeUnit timeoutUnit) {
|
private void closeEventSource(boolean waitingForCompletion) {
|
||||||
SseEventSource localEventSource = eventSource;
|
SseEventSource localEventSource = eventSource;
|
||||||
if (localEventSource != null) {
|
if (localEventSource != null) {
|
||||||
if (!localEventSource.isOpen()) {
|
if (!localEventSource.isOpen() || completed) {
|
||||||
logger.debug("Existing EventSource is already closed");
|
logger.debug("Existing EventSource is already closed");
|
||||||
} else if (localEventSource.close(timeout, timeoutUnit)) {
|
} else if (localEventSource.close(waitingForCompletion ? 10 : 0, TimeUnit.SECONDS)) {
|
||||||
logger.debug("Succesfully closed existing EventSource");
|
logger.debug("Succesfully closed existing EventSource");
|
||||||
} else {
|
} else {
|
||||||
logger.debug("Failed to close existing EventSource");
|
logger.debug("Failed to close existing EventSource");
|
||||||
@ -435,6 +436,12 @@ public class RemoteopenhabRestClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void onComplete() {
|
||||||
|
logger.debug("Disconnected from streaming events");
|
||||||
|
completed = true;
|
||||||
|
listeners.forEach(listener -> listener.onDisconnected());
|
||||||
|
}
|
||||||
|
|
||||||
private void onError(Throwable error) {
|
private void onError(Throwable error) {
|
||||||
logger.debug("Error occurred while receiving events", error);
|
logger.debug("Error occurred while receiving events", error);
|
||||||
listeners.forEach(listener -> listener.onError("Error occurred while receiving events"));
|
listeners.forEach(listener -> listener.onError("Error occurred while receiving events"));
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user