From c918c93f0fb1affe54091e67c34458d35dc6cc44 Mon Sep 17 00:00:00 2001 From: moznion Date: Wed, 9 Dec 2020 02:48:16 +0900 Subject: [PATCH] #933: Set an unexpected error hook to destroy the demo client And implements `Destroyable` interface for each threading task that runs with the demo client application. The reason why it doesn't set the hook at `LeshanClient` is to keep the backward compatibility, this means it delegates "what should client do once an unexpected error has occurred" to the users. Signed-off-by: moznion --- .../leshan/client/demo/LeshanClientDemo.java | 16 ++++++++++++++++ .../org/eclipse/leshan/client/demo/MyDevice.java | 12 ++++++++++-- .../client/demo/RandomTemperatureSensor.java | 8 +++++++- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/leshan-client-demo/src/main/java/org/eclipse/leshan/client/demo/LeshanClientDemo.java b/leshan-client-demo/src/main/java/org/eclipse/leshan/client/demo/LeshanClientDemo.java index 7316a05930..0c1fd5b200 100644 --- a/leshan-client-demo/src/main/java/org/eclipse/leshan/client/demo/LeshanClientDemo.java +++ b/leshan-client-demo/src/main/java/org/eclipse/leshan/client/demo/LeshanClientDemo.java @@ -63,6 +63,7 @@ import org.eclipse.leshan.client.californium.LeshanClientBuilder; import org.eclipse.leshan.client.engine.DefaultRegistrationEngineFactory; import org.eclipse.leshan.client.object.Server; +import org.eclipse.leshan.client.observer.LwM2mClientObserverAdapter; import org.eclipse.leshan.client.resource.LwM2mObjectEnabler; import org.eclipse.leshan.client.resource.ObjectsInitializer; import org.eclipse.leshan.client.resource.listener.ObjectsListenerAdapter; @@ -691,6 +692,7 @@ public void objectAdded(LwM2mObjectEnabler object) { LOG.info("Object {} enabled.", object.getId()); } }); + client.addObserver(new ShutdownOnUnexpectedErrorObserver(client)); // Display client public key to easily add it in demo servers. if (clientPublicKey != null) { @@ -807,4 +809,18 @@ public void run() { } } } + + private static class ShutdownOnUnexpectedErrorObserver extends LwM2mClientObserverAdapter { + final LeshanClient client; + + public ShutdownOnUnexpectedErrorObserver(final LeshanClient client) { + this.client = client; + } + + @Override + public void onUnexpectedError(Throwable unexpectedError) { + LOG.error("unexpected error occurred. destroy the leshan-client", unexpectedError); + client.destroy(true); + } + } } diff --git a/leshan-client-demo/src/main/java/org/eclipse/leshan/client/demo/MyDevice.java b/leshan-client-demo/src/main/java/org/eclipse/leshan/client/demo/MyDevice.java index 5453fa05ec..6be4277e01 100644 --- a/leshan-client-demo/src/main/java/org/eclipse/leshan/client/demo/MyDevice.java +++ b/leshan-client-demo/src/main/java/org/eclipse/leshan/client/demo/MyDevice.java @@ -14,6 +14,7 @@ import org.eclipse.leshan.client.resource.BaseInstanceEnabler; import org.eclipse.leshan.client.servers.ServerIdentity; +import org.eclipse.leshan.core.Destroyable; import org.eclipse.leshan.core.model.ObjectModel; import org.eclipse.leshan.core.model.ResourceModel.Type; import org.eclipse.leshan.core.node.LwM2mResource; @@ -23,7 +24,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class MyDevice extends BaseInstanceEnabler { +public class MyDevice extends BaseInstanceEnabler implements Destroyable { private static final Logger LOG = LoggerFactory.getLogger(MyDevice.class); @@ -31,9 +32,11 @@ public class MyDevice extends BaseInstanceEnabler { private static final List supportedResources = Arrays.asList(0, 1, 2, 3, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21); + private final Timer timer; + public MyDevice() { // notify new date each 5 second - Timer timer = new Timer("Device-Current Time"); + timer = new Timer("Device-Current Time"); timer.schedule(new TimerTask() { @Override public void run() { @@ -209,4 +212,9 @@ private long getMemoryTotal() { public List getAvailableResourceIds(ObjectModel model) { return supportedResources; } + + @Override + public void destroy() { + timer.cancel(); + } } diff --git a/leshan-client-demo/src/main/java/org/eclipse/leshan/client/demo/RandomTemperatureSensor.java b/leshan-client-demo/src/main/java/org/eclipse/leshan/client/demo/RandomTemperatureSensor.java index 7719a55f53..8a1fa3f565 100644 --- a/leshan-client-demo/src/main/java/org/eclipse/leshan/client/demo/RandomTemperatureSensor.java +++ b/leshan-client-demo/src/main/java/org/eclipse/leshan/client/demo/RandomTemperatureSensor.java @@ -11,6 +11,7 @@ import org.eclipse.leshan.client.resource.BaseInstanceEnabler; import org.eclipse.leshan.client.servers.ServerIdentity; +import org.eclipse.leshan.core.Destroyable; import org.eclipse.leshan.core.model.ObjectModel; import org.eclipse.leshan.core.response.ExecuteResponse; import org.eclipse.leshan.core.response.ReadResponse; @@ -18,7 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class RandomTemperatureSensor extends BaseInstanceEnabler { +public class RandomTemperatureSensor extends BaseInstanceEnabler implements Destroyable { private static final Logger LOG = LoggerFactory.getLogger(RandomTemperatureSensor.class); @@ -113,4 +114,9 @@ private void resetMinMaxMeasuredValues() { public List getAvailableResourceIds(ObjectModel model) { return supportedResources; } + + @Override + public void destroy() { + scheduler.shutdown(); + } }