如何处理服务器断开连接或重新启动OPC UA milo后的重新订阅?
java opc-ua milo
嗨,我想知道如何处理(正确)与OPC UA米洛重新订阅。目前我使用以下代码创建订阅:
private CompletableFuture<DataValue> subscribe(NodeId nodeToSubscribe, double samplingInterval, Consumer<DataValue> onChangeDo){
CompletableFuture<DataValue> result = new CompletableFuture<>();
try{
//sets parameters of subscription
ManagedSubscription subscription = ManagedSubscription.create(client, samplingInterval);
subscription.setDefaultSamplingInterval(samplingInterval);
subscription.setDefaultQueueSize(uint(10));
//adds "onChange" action
ManagedDataItem managedDataItem = subscription.createDataItem(nodeToSubscribe, item -> item.addDataValueListener(onChangeDo));
//wait till first value was read
ManagedDataItem.DataValueListener listener = managedDataItem.addDataValueListener(result::complete);
result.whenComplete((v,e) -> managedDataItem.removeDataValueListener(listener));
} catch (UaException e){
result.completeExceptionally(e);
}
return result;
}
但是,每当服务器重新启动或客户机和服务器之间的连接中断时,订阅就不起作用。
我可以添加会话活动监听器,当连接中断时,像那样清除订阅管理器(星星之间的代码)。
addSessionActivityListener(new SessionActivityListener(){
@Override
public void onSessionActive(UaSession session) {
log.info("Connecting PLC with IP address {}",ipAddress);
setConnectionStatus(ConnectionStatus.CONNECTED);
**subscribeAll();**
}
@Override
public void onSessionInactive(UaSession session) {
log.info("Disconnecting PLC with IP address {}",ipAddress);
setConnectionStatus(ConnectionStatus.DISCONNECTED);
**uaClient.getSubscriptionManager().clearSubscriptions();**
}
});
但也许有更好的方法来处理这个问题。我所有的代码都可以在这里找到