Skip to content

Commit 407b49a

Browse files
committed
Add ConnectionListener support to NettyRtuClientTransport
1 parent 69f0b5d commit 407b49a

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed

modbus-tcp/src/main/java/com/digitalpetri/modbus/tcp/client/NettyRtuClientTransport.java

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@
88
import com.digitalpetri.modbus.ModbusRtuResponseFrameParser.ParserState;
99
import com.digitalpetri.modbus.client.ModbusRtuClientTransport;
1010
import com.digitalpetri.modbus.internal.util.ExecutionQueue;
11+
import com.digitalpetri.modbus.tcp.client.NettyTcpClientTransport.ConnectionListener;
1112
import com.digitalpetri.netty.fsm.ChannelActions;
1213
import com.digitalpetri.netty.fsm.ChannelFsm;
14+
import com.digitalpetri.netty.fsm.ChannelFsm.TransitionListener;
1315
import com.digitalpetri.netty.fsm.ChannelFsmConfig;
1416
import com.digitalpetri.netty.fsm.ChannelFsmFactory;
1517
import com.digitalpetri.netty.fsm.Event;
@@ -29,8 +31,10 @@
2931
import io.netty.handler.ssl.SslContext;
3032
import io.netty.handler.ssl.SslContextBuilder;
3133
import io.netty.handler.ssl.SslProtocols;
34+
import java.util.List;
3235
import java.util.concurrent.CompletableFuture;
3336
import java.util.concurrent.CompletionStage;
37+
import java.util.concurrent.CopyOnWriteArrayList;
3438
import java.util.concurrent.atomic.AtomicReference;
3539
import java.util.function.Consumer;
3640
import org.slf4j.Logger;
@@ -47,6 +51,8 @@ public class NettyRtuClientTransport implements ModbusRtuClientTransport {
4751
private final ModbusRtuResponseFrameParser frameParser = new ModbusRtuResponseFrameParser();
4852
private final AtomicReference<Consumer<ModbusRtuFrame>> frameReceiver = new AtomicReference<>();
4953

54+
private final List<ConnectionListener> connectionListeners = new CopyOnWriteArrayList<>();
55+
5056
private final ChannelFsm channelFsm;
5157
private final ExecutionQueue executionQueue;
5258

@@ -65,11 +71,29 @@ public NettyRtuClientTransport(NettyClientTransportConfig config) {
6571
.build());
6672

6773
channelFsm.addTransitionListener(
68-
(from, to, via) -> logger.debug("onStateTransition: {} -> {} via {}", from, to, via));
74+
(from, to, via) -> {
75+
logger.debug("onStateTransition: {} -> {} via {}", from, to, via);
76+
77+
maybeNotifyConnectionListeners(from, to);
78+
});
6979

7080
executionQueue = new ExecutionQueue(config.executor());
7181
}
7282

83+
@SuppressWarnings("DuplicatedCode")
84+
private void maybeNotifyConnectionListeners(State from, State to) {
85+
if (connectionListeners.isEmpty()) {
86+
return;
87+
}
88+
89+
if (from != State.Connected && to == State.Connected) {
90+
executionQueue.submit(() -> connectionListeners.forEach(ConnectionListener::onConnection));
91+
} else if (from == State.Connected && to != State.Connected) {
92+
executionQueue.submit(
93+
() -> connectionListeners.forEach(ConnectionListener::onConnectionLost));
94+
}
95+
}
96+
7397
@Override
7498
public CompletableFuture<Void> connect() {
7599
return channelFsm.connect().thenApply(c -> null);
@@ -85,6 +109,36 @@ public boolean isConnected() {
85109
return channelFsm.getState() == State.Connected;
86110
}
87111

112+
/**
113+
* Get the {@link ChannelFsm} used by this transport.
114+
*
115+
* <p>This should not generally be used by client code except perhaps to add a {@link
116+
* TransitionListener} to receive more detailed callbacks about the connection status.
117+
*
118+
* @return the {@link ChannelFsm} used by this transport.
119+
*/
120+
public ChannelFsm getChannelFsm() {
121+
return channelFsm;
122+
}
123+
124+
/**
125+
* Add a {@link ConnectionListener} to this transport.
126+
*
127+
* @param listener the listener to add.
128+
*/
129+
public void addConnectionListener(ConnectionListener listener) {
130+
connectionListeners.add(listener);
131+
}
132+
133+
/**
134+
* Remove a {@link ConnectionListener} from this transport.
135+
*
136+
* @param listener the listener to remove.
137+
*/
138+
public void removeConnectionListener(ConnectionListener listener) {
139+
connectionListeners.remove(listener);
140+
}
141+
88142
@Override
89143
public CompletionStage<Void> send(ModbusRtuFrame frame) {
90144
return channelFsm

modbus-tcp/src/main/java/com/digitalpetri/modbus/tcp/client/NettyTcpClientTransport.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ public NettyTcpClientTransport(NettyClientTransportConfig config) {
7575
});
7676
}
7777

78+
@SuppressWarnings("DuplicatedCode")
7879
private void maybeNotifyConnectionListeners(State from, State to) {
7980
if (connectionListeners.isEmpty()) {
8081
return;

0 commit comments

Comments
 (0)