#java #opc-ua #milo
#java #opc-ua #мило
Вопрос:
У меня есть клиент milo opc ua и добавлен прослушиватель ошибок с помощью client.addFaultListener (this), и я переопределил метод onServiceFault (чтобы он реализовывал ServiceFaultListener).
Когда я выключаю свой сервер opc ua, я получаю только сообщения от milo: [ПРЕДУПРЕЖДЕНИЕ] [org.eclipse.milo.opcua.sdk.cli] [4] Сохранить значение failureCount = 1 превышает failuresAllowed = 0, но мой прослушиватель ошибок не выполняется.
В каких случаях прослушиватель onServiceFault выполняется milo?
Ответ №1:
Он вызывается, когда клиент фактически получает ответ ServiceFault от сервера, что может произойти в различных сценариях, один из которых заключается в том, что сервер не поддерживает службу, которую вы вызвали.
Завершение работы сервера, как вы это сделали, должно привести к onSessionInactive
вызову любого SessionListener, который вы добавили к клиенту.
Комментарии:
1. Подсказка с сеансом и onSessionInactive отличная, теперь я могу отслеживать состояние моего соединения… Спасибо, Кевин!
2. @AndreasVogler просто имейте в виду, что обратный вызов носит чисто информационный характер, для мониторинга состояния, как вы предложили, и что клиент автоматически попытается повторно подключиться и восстановить сеанс на неопределенный срок, пока вы не позвоните
client.disconnect()
.3. Да, спасибо. Мне это нужно для восстановления подписок — они теряются, например, при перезапуске сервера. Кстати.: должен ли я каким-то образом очищать старые подписки? в настоящее время я делаю: подписка. deleteMonitoredItems(subscription.getMonitoredItems()); … но я не уверен, действительно ли это необходимо, или, может быть, мне нужно сделать больше, чем это?
4. Вам не нужно очищать старые подписки. Если они не могут быть восстановлены / переданы, то нет оснований полагать, что вызов для удаления элементов будет иметь какой-либо успех. Правильное место для повторного создания ваших подписок после повторного подключения — это когда
SubscriptionListener#onSubscriptionTransferFailed
обратный вызов уведомляет вас о невозможности восстановления подписок.
Ответ №2:
Думаю, теперь я могу сам ответить на свой вопрос: например, он вызывается, когда соединение с серверами теряется, и milo выполняет повторное подключение, но передача подписок завершается неудачно, и когда эта недействительная подписка используется впоследствии, тогда milo выполнит ServiceFault, подобный этому, со статусом Bad_SubscriptionIdInvalid .
ServiceFault(responseHeader=ResponseHeader(timestamp=DateTime{utcTime=132556030188286769, javaDate=Wed Jan 20 08:56:58 CET 2021}, requestHandle=116, serviceResult=StatusCode{name=Bad_SubscriptionIdInvalid, value=0x80280000, quality=bad}, serviceDiagnostics=null, stringTable=[], additionalHeader=ExtensionObject{encoded=ByteString{bytes=null}, encodingId=NodeId{ns=0, id=0}}))