disconnects/re-connects 在客户端的 Eclipse Milo 中如何处理?
How are disconnects/re-connects handled in Eclipse Milo on the client side?
我正在使用 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 似乎知道这种情况,但没有尝试重新注册那些项目。那是要手动完成吗?
OPC-UA 第 4 部分第 6.5 节中有一个流程图描述了客户端应遵循的重新连接顺序。它涉及尝试重新使用相同的安全通道,尝试重新激活先前的会话,甚至在失败时尝试将订阅转移到新会话。 Milo 客户端 SDK 可以完成所有这些工作。
重启服务器是最坏的情况,因为它会丢弃进程中的所有状态,这与正常的网络中断不同。在这种情况下,客户端 SDK 将通过回调通知它在重新连接后尝试恢复状态失败并且必须手动重新创建订阅。
将 SubscriptionListener
添加到 UaSubscriptionManager
,如果您收到 onSubscriptionTransferFailed
回调,那么是时候重新创建订阅和监控项了。
我正在使用 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 似乎知道这种情况,但没有尝试重新注册那些项目。那是要手动完成吗?
OPC-UA 第 4 部分第 6.5 节中有一个流程图描述了客户端应遵循的重新连接顺序。它涉及尝试重新使用相同的安全通道,尝试重新激活先前的会话,甚至在失败时尝试将订阅转移到新会话。 Milo 客户端 SDK 可以完成所有这些工作。
重启服务器是最坏的情况,因为它会丢弃进程中的所有状态,这与正常的网络中断不同。在这种情况下,客户端 SDK 将通过回调通知它在重新连接后尝试恢复状态失败并且必须手动重新创建订阅。
将 SubscriptionListener
添加到 UaSubscriptionManager
,如果您收到 onSubscriptionTransferFailed
回调,那么是时候重新创建订阅和监控项了。