在Eclipse Milo客户端中,断开/重新连接是如何处理的?

7
我正在使用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));
   }
}

现在当我重启我的OPC UA服务器时,它也是使用Eclipse Milo实现的,然后我确实看到客户端重新连接,但订阅不再收到更新。在日志中,我得到以下输出:

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已经意识到了这种情况,但并不会尝试重新注册那些项目。需要手动完成吗?

1个回答

8

在OPC-UA 第4部分第6.5节中,有一张流程图描述了客户端应该遵循的重新连接序列。它包括尝试重用相同的安全通道、尝试重新激活先前的会话,甚至在这些尝试失败后,尝试将订阅转移到新会话中。Milo客户端SDK可以完成所有这些操作。

最坏情况是重启服务器,因为这将丢弃所有状态,而不像正常的网络中断。在这种情况下,客户端SDK将通过回调通知其重新连接后恢复状态的尝试已失败,并且必须手动重新创建订阅。

UaSubscriptionManager添加一个SubscriptionListener,如果您收到onSubscriptionTransferFailed回调,则是重新创建订阅和监视项的时候了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接