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));
   }
}

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 は状況を認識しているように見えますが、それらのアイテムを再登録しようとはしていません。それは手動で行うことですか?

4

1 に答える 1

8

OPC-UA パート 4、セクション 6.5 には、クライアントが従うべき再接続シーケンスを説明するフローチャートがあります。これには、同じセキュア チャネルの再利用の試行、前のセッションの再アクティブ化の試行、さらには失敗した場合にサブスクリプションの新しいセッションへの転送の試行が含まれます。Milo クライアント SDK は、これらすべてを行います。

サーバーの再起動は、通常のネットワーク中断とは異なり、プロセス内のすべての状態を破棄するため、最悪のケースです。この場合、クライアント SDK はコールバックを介して、再接続後に状態を復元しようとして失敗したこと、およびサブスクリプションを手動で再作成する必要があることを通知します。

を追加しSubscriptionListener、コールバックUaSubscriptionManagerを受信した場合はonSubscriptionTransferFailed、サブスクリプションと監視対象アイテムを再作成します。

于 2016-07-11T13:26:25.080 に答える