Skip to content

Commit 8718b23

Browse files
jwveldhuisseaside1
authored andcommitted
[denonmarantz] Run the Telnet socket in a dedicated thread (openhab#9511)
* Run the Telnet socket in a dedicated thread, not from the shared thread pool. Fixes openhab#9494 Signed-off-by: Jan-Willem Veldhuis <[email protected]>
1 parent ebf2247 commit 8718b23

File tree

4 files changed

+31
-27
lines changed

4 files changed

+31
-27
lines changed

bundles/org.openhab.binding.denonmarantz/src/main/java/org/openhab/binding/denonmarantz/internal/connector/DenonMarantzConnectorFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@
2929
public class DenonMarantzConnectorFactory {
3030

3131
public DenonMarantzConnector getConnector(DenonMarantzConfiguration config, DenonMarantzState state,
32-
ScheduledExecutorService scheduler, HttpClient httpClient) {
32+
ScheduledExecutorService scheduler, HttpClient httpClient, String thingUID) {
3333
if (config.isTelnet()) {
34-
return new DenonMarantzTelnetConnector(config, state, scheduler);
34+
return new DenonMarantzTelnetConnector(config, state, scheduler, thingUID);
3535
} else {
3636
return new DenonMarantzHttpConnector(config, state, scheduler, httpClient);
3737
}
Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@
3131
* @author Jeroen Idserda - Initial contribution (1.x Binding)
3232
* @author Jan-Willem Veldhuis - Refactored for 2.x
3333
*/
34-
public class DenonMarantzTelnetClient implements Runnable {
34+
public class DenonMarantzTelnetClientThread extends Thread {
3535

36-
private Logger logger = LoggerFactory.getLogger(DenonMarantzTelnetClient.class);
36+
private Logger logger = LoggerFactory.getLogger(DenonMarantzTelnetClientThread.class);
3737

3838
private static final Integer RECONNECT_DELAY = 60000; // 1 minute
3939

@@ -43,8 +43,6 @@ public class DenonMarantzTelnetClient implements Runnable {
4343

4444
private DenonMarantzTelnetListener listener;
4545

46-
private boolean running = true;
47-
4846
private boolean connected = false;
4947

5048
private Socket socket;
@@ -53,15 +51,15 @@ public class DenonMarantzTelnetClient implements Runnable {
5351

5452
private BufferedReader in;
5553

56-
public DenonMarantzTelnetClient(DenonMarantzConfiguration config, DenonMarantzTelnetListener listener) {
54+
public DenonMarantzTelnetClientThread(DenonMarantzConfiguration config, DenonMarantzTelnetListener listener) {
5755
logger.debug("Denon listener created");
5856
this.config = config;
5957
this.listener = listener;
6058
}
6159

6260
@Override
6361
public void run() {
64-
while (running) {
62+
while (!isInterrupted()) {
6563
if (!connected) {
6664
connectTelnetSocket();
6765
}
@@ -90,20 +88,21 @@ public void run() {
9088
connected = false;
9189
}
9290
} catch (IOException e) {
93-
if (!Thread.currentThread().isInterrupted()) {
91+
if (!isInterrupted()) {
9492
// only log if we don't stop this on purpose causing a SocketClosed
9593
logger.debug("Error in telnet connection ", e);
9694
}
9795
connected = false;
9896
listener.telnetClientConnected(false);
9997
}
100-
} while (running && connected);
98+
} while (!isInterrupted() && connected);
10199
}
100+
disconnect();
101+
logger.debug("Stopped client thread");
102102
}
103103

104104
public void sendCommand(String command) {
105105
if (out != null) {
106-
logger.debug("Sending command {}", command);
107106
try {
108107
out.write(command + '\r');
109108
out.flush();
@@ -116,21 +115,21 @@ public void sendCommand(String command) {
116115
}
117116

118117
public void shutdown() {
119-
this.running = false;
120118
disconnect();
121119
}
122120

123121
private void connectTelnetSocket() {
124122
disconnect();
125123
int delay = 0;
126124

127-
while (this.running && (socket == null || !socket.isConnected())) {
125+
while (!isInterrupted() && (socket == null || !socket.isConnected())) {
128126
try {
129127
Thread.sleep(delay);
130128
logger.debug("Connecting to {}", config.getHost());
131129

132-
// Use raw socket instead of TelnetClient here because TelnetClient sends an extra newline char
133-
// after each write which causes the connection to become unresponsive.
130+
// Use raw socket instead of TelnetClient here because TelnetClient sends an
131+
// extra newline char after each write which causes the connection to become
132+
// unresponsive.
134133
socket = new Socket();
135134
socket.connect(new InetSocketAddress(config.getHost(), config.getTelnetPort()), TIMEOUT);
136135
socket.setKeepAlive(true);
@@ -141,6 +140,7 @@ private void connectTelnetSocket() {
141140

142141
connected = true;
143142
listener.telnetClientConnected(true);
143+
logger.debug("Denon telnet client connected to {}", config.getHost());
144144
} catch (IOException e) {
145145
logger.debug("Cannot connect to {}", config.getHost(), e);
146146
listener.telnetClientConnected(false);
@@ -149,8 +149,6 @@ private void connectTelnetSocket() {
149149
}
150150
delay = RECONNECT_DELAY;
151151
}
152-
153-
logger.debug("Denon telnet client connected to {}", config.getHost());
154152
}
155153

156154
public boolean isConnected() {

bundles/org.openhab.binding.denonmarantz/src/main/java/org/openhab/binding/denonmarantz/internal/connector/telnet/DenonMarantzTelnetConnector.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,30 +46,32 @@ public class DenonMarantzTelnetConnector extends DenonMarantzConnector implement
4646

4747
private static final BigDecimal NINETYNINE = new BigDecimal("99");
4848

49-
private DenonMarantzTelnetClient telnetClient;
49+
private DenonMarantzTelnetClientThread telnetClientThread;
5050

5151
private boolean displayNowplaying = false;
5252

5353
protected boolean disposing = false;
5454

5555
private Future<?> telnetStateRequest;
5656

57-
private Future<?> telnetRunnable;
57+
private String thingUID;
5858

5959
public DenonMarantzTelnetConnector(DenonMarantzConfiguration config, DenonMarantzState state,
60-
ScheduledExecutorService scheduler) {
60+
ScheduledExecutorService scheduler, String thingUID) {
6161
this.config = config;
6262
this.scheduler = scheduler;
6363
this.state = state;
64+
this.thingUID = thingUID;
6465
}
6566

6667
/**
6768
* Set up the connection to the receiver. Either using Telnet or by polling the HTTP API.
6869
*/
6970
@Override
7071
public void connect() {
71-
telnetClient = new DenonMarantzTelnetClient(config, this);
72-
telnetRunnable = scheduler.submit(telnetClient);
72+
telnetClientThread = new DenonMarantzTelnetClientThread(config, this);
73+
telnetClientThread.setName("OH-binding-" + thingUID);
74+
telnetClientThread.start();
7375
}
7476

7577
@Override
@@ -98,9 +100,12 @@ public void dispose() {
98100
telnetStateRequest = null;
99101
}
100102

101-
if (telnetClient != null && !telnetRunnable.isDone()) {
102-
telnetRunnable.cancel(true);
103-
telnetClient.shutdown();
103+
if (telnetClientThread != null) {
104+
telnetClientThread.interrupt();
105+
// Invoke a shutdown after interrupting the thread to close the socket immediately,
106+
// otherwise the client keeps running until a line was received from the telnet connection
107+
telnetClientThread.shutdown();
108+
telnetClientThread = null;
104109
}
105110
}
106111

@@ -262,7 +267,7 @@ protected void internalSendCommand(String command) {
262267
logger.warn("Trying to send empty command");
263268
return;
264269
}
265-
telnetClient.sendCommand(command);
270+
telnetClientThread.sendCommand(command);
266271
}
267272

268273
/**

bundles/org.openhab.binding.denonmarantz/src/main/java/org/openhab/binding/denonmarantz/internal/handler/DenonMarantzHandler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,8 @@ private void createConnection() {
314314
if (connector != null) {
315315
connector.dispose();
316316
}
317-
connector = connectorFactory.getConnector(config, denonMarantzState, scheduler, httpClient);
317+
connector = connectorFactory.getConnector(config, denonMarantzState, scheduler, httpClient,
318+
this.getThing().getUID().getAsString());
318319
connector.connect();
319320
}
320321

0 commit comments

Comments
 (0)