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

时间:2016-07-11 07:16:45

标签: java opc-ua

我正在使用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 个答案:

答案 0 :(得分:4)

有一个流程图描述了客户端在OPC-UA第4部分第6.5节中应遵循的重新连接顺序。它涉及尝试重新使用相同的安全通道,尝试重新激活先前的会话,甚至尝试将订阅转移到新会话(如果失败)。 Milo客户端SDK可以完成所有这些工作。

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

HttpRequest添加SubscriptionListener,如果您收到UaSubscriptionManager回调,则可以重新创建订阅和受监控项目。