我正在使用Eclipse Milo编写OPC UA客户端,并且偶然发现了以下问题:客户端如何处理连接丢失。
对于监视值,我可以通过使用SubscriptionManager进行订阅来实现:
OpcUaClient client = myCreateClient();
List<MonitoredItemCreateRequest> items = myCreateMonitoredItems();
UaSubscription subscription = client.getSubscriptionManager().createSubscription(1_000.0).get();
List<UaMonitoredItem> result = subscription.createMonitoredItems(TimestampsToReturn.Both, items).get();
for (UaMonitoredItem item : result) {
if (!item.getStatusCode().isBad()) {
item.setValueConsumer(value -> System.out.println("Update: " + value));
}
}
现在,当我重新启动也使用Eclipse Milo实现的OPC UA服务器时,我确实看到了客户端重新连接,但是订阅没有获得更多更新。在日志中,我得到以下输出:
09:11:15.734 [ua-shared-pool-0] DEBUG o.e.m.o.s.c.s.OpcUaSubscriptionManager - Publish service failure: StatusCode{name=Bad_NoSubscription, value=0x80790000, quality=bad}
java.util.concurrent.CompletionException: UaServiceFaultException: status=Bad_NoSubscription, message=There is no subscription available for this session.
<stack-trace-omitted>
…
因此,似乎OpcUaSubscriptionManager知道了这种情况,但没有尝试重新注册这些项目。是手动完成吗?
在OPC-UA第4部分第6.5节中,有一个流程图描述了客户端应遵循的重新连接顺序。它涉及尝试重新使用同一安全通道,尝试重新激活先前的会话,甚至在失败的情况下甚至尝试将订阅转移到新会话。Milo客户端SDK可以完成所有这一切。
重新启动服务器是最坏的情况,因为与正常的网络中断不同,它会丢弃进程中的所有状态。在这种情况下,客户端SDK将通过回调通知其重新连接后恢复状态的尝试失败,并且必须手动重新创建订阅。
一个添加SubscriptionListener
到UaSubscriptionManager
,如果你收到onSubscriptionTransferFailed
回调那么它的时间来重新创建订阅和监控的项目。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句