Большинство API промежуточного ПО возвращают объект SdvResult. В случае успеха этот объект содержит ожидаемый объект результата. В случае сбоя этот объект содержит объект SdvStatus, указывающий на непредвиденное поведение или ошибку, часто идентифицируемую кодом ошибки, например Internal, Unavailable или DataLoss.
На этой странице рассказывается, как устранить неполадки, связанные с этими кодами ошибок.
Устранение неполадок с регистрацией и созданием
Ошибки регистрации и создания обычно возникают при попытке создать или зарегистрировать недопустимый сервис.
Не удалось создать вторую услугу
Ошибка.
Internal ошибка.
Причина
Вы пытаетесь дважды зарегистрировать один и тот же экземпляр пакета сервисов (с тем же названием и идентификатором).
Решение
Не пытайтесь зарегистрировать один и тот же экземпляр пакета услуг (название и идентификатор экземпляра) дважды.
Не удалось удалить повторяющийся пакет услуг
Ошибка.
Status(-3, EX_ILLEGAL_ARGUMENT)
Причина
Вы пытаетесь удалить повторяющийся пакет услуг, которого не существует.
Решение
Не пытайтесь удалить несуществующий пакет услуг.
Не удается получить экземпляр издателя для отправки сообщений.
Ошибка.
Вызов take_publisher возвращает none.
Причина
Вы дважды вызвали take_publisher для одного и того же варианта из одного и того же экземпляра пакета сервисов.
Решение
Не вызывайте take_publisher дважды для одного и того же варианта из одного и того же экземпляра пакета сервисов.
Не удается создать Subscriber, Observer, History или InstantReader.
Ошибка.
Unavailable ошибка.
Причина
Вы попытались создать Subscriber, Observer, History или InstantReader для издателя, который не существует или регистрация которого была отменена.
Решение
Прежде чем создавать для издателя Subscriber, Observer, History или InstantReader, убедитесь, что он существует или зарегистрирован.
Не удалось создать клиент RPC.
Ошибка.
Unavailable: ошибка
Причина
Вы попытались создать RPC-клиент для несуществующего или незарегистрированного имени сервера.
Решение
Прежде чем создавать RPC-клиент, убедитесь, что сервер существует и зарегистрирован.
Устранение неполадок со связью
Сбои связи могут возникать после того, как сервис выполнил свою задачу и начинает взаимодействовать с другими сервисами.
Устранение неполадок с отменой регистрации издателя
Если издатель отменит регистрацию, пока его читатели ещё активны, могут возникнуть ошибки.
Метод read_next_messages подписчика возвращает пустые списки
Ошибка.
read_next_messages выполняется успешно, но возвращает пустые списки.
Причина
Издатель отменил регистрацию, но его читатели активны.
Решение
Используйте подписчика или историю с потоком доступности. Если последнее сообщение в потоке недоступно, значит издатель отменил регистрацию и новых сообщений нет.
Следующий метод наблюдателя возвращает внутреннюю ошибку
Ошибка.
next возвращает ошибку Internal.
Причина
Издатель отменил регистрацию, но его читатели активны.
Решение
Используйте подписчика или историю с потоком доступности. Если последнее сообщение в потоке недоступно, значит издатель больше не работает и новых сообщений не будет.
Метод read_from_history не возвращает новые сообщения
Ошибка.
read_from_history не возвращает новые сообщения, только старые.
Причина
Издатель отменил регистрацию, но его читатели активны.
Решение
Используйте подписчика или историю с потоком доступности. Если последнее сообщение в потоке недоступно, значит издатель больше не работает и новых сообщений не будет.
InstantReader read_latest_message возвращает внутреннюю ошибку
Ошибка.
read_latest_message возвращает ошибку Internal.
Причина
Издатель отменил регистрацию, но его читатели активны.
Решение
Используйте подписчика или историю с потоком доступности. Если последнее сообщение в потоке недоступно, значит издатель больше не работает и новых сообщений не будет.
Устранение неполадок: пустая очередь сообщений
При попытке чтения из пустой очереди сообщений могут возникать ошибки.
Метод read_next_messages подписчика возвращает пустой список
Ошибка.
read_next_messages возвращает пустой список.
Причина
Издатель активен, но не отправлял сообщения.
Решение
Используйте подписчика или историю с потоком доступности. Если последнее сообщение в потоке доступности доступно, то издатель активен и новых сообщений нет.
Следующий метод наблюдателя возвращает внутреннюю ошибку
Ошибка.
next возвращает ошибку Internal.
Причина
Издатель активен, но не отправлял сообщения.
Решение
Используйте подписчика или историю с потоком доступности. Если последнее сообщение в потоке доступности доступно, то издатель активен и новых сообщений нет.
Метод read_from_history не возвращает новые сообщения
Ошибка.
read_from_history возвращает пустой список.
Причина
Издатель активен, но не отправлял сообщения.
Решение
Используйте подписчика или историю с потоком доступности. Если последнее сообщение в потоке доступности доступно, то издатель активен и новых сообщений нет.
InstantReader read_latest_message возвращает внутреннюю ошибку
Ошибка.
read_latest_message возвращает ошибку Internal.
Причина
Издатель активен, но не отправлял сообщения.
Решение
Используйте подписчика или историю с потоком доступности. Если последнее сообщение в потоке доступности доступно, то издатель активен и новых сообщений нет.
Как устранить переполнение буфера или потерю данных
Ошибки могут возникать, когда издатель отправляет сообщения быстрее, чем читатель может их обработать.
Первое чтение подписчика после переполнения возвращает ошибку DataLoss
Ошибка.
read_next_messages возвращает ошибку DataLoss.
Причина
Издатель отправляет сообщения быстрее, чем читатель может их обработать.
Решение
Возможные способы устранения ошибок:
- Увеличьте размер кольцевого буфера издателя
capacityв определении архитектуры VSIDL, чтобы очередь могла поглощать всплески сообщений до того, как подписчик их прочитает. - Увеличьте частоту обработки сообщений подписчиком или уменьшите частоту отправки сообщений издателем.
- Используйте
InstantReaderвместоSubscriber, если вашему сервису нужно только последнее значение сообщения и не нужно обрабатывать каждое промежуточное обновление.
Первый вызов next наблюдателя после переполнения возвращает ошибку DataLoss.
Ошибка.
next возвращает ошибку DataLoss.
Причина
Издатель отправляет сообщения быстрее, чем читатель может их обработать.
Решение
Возможные способы устранения ошибок:
Издатель публикует контент реже. Например, у вас может быть переменная с временной меткой последнего сообщения. Если текущее время меньше, чем время последней публикации плюс дельта, то сообщение не публикуется. При использовании этого механизма публикуется не более одного сообщения на дельту.
Потребитель использует объект
InstantReadвместо наблюдателя. ОбъектInstantReadне возвращает ошибки переполнения и всегда возвращает последнее сообщение. Если вас интересует только последнее сообщение, вместо наблюдателя можно использовать объектInstantRead.Потребитель реализует выборку. Если в вашем решении есть издатель (P1), который публикует сообщения быстрее, чем наблюдатель (O1) может их прочитать, вы можете создать нового издателя (P2) и наблюдателя (O2), чтобы компенсировать разницу в скорости публикации и чтения.
Например, если P1 публикует сообщение каждые 10 мс, а O1 может читать только одно сообщение каждые 100 мс, то остальные девять сообщений будут удалены. Чтобы устранить расхождение, создайте решение, выполнив следующие действия:
- P1 публикует сообщения в O2.
- O2 читает одно сообщение и удаляет девять.
- O2 отправляет прочитанное сообщение P2.
- P2 отправляет прочитанное сообщение O1.
- O1 читает одно сообщение каждые десять секунд.
В примере кода ниже показано, как реализовать этот сценарий выборки:
int discarded_message = 10; while (true) { message m = O2.read_message(); if discarded_message == 10 { discarded_message = 0; P2.publish(m); } else { discarded_message ++; } }
История прочитана не полностью
Ошибка.
Сообщение потеряно до копирования истории. При чтении не показывается уведомление об ошибке.
Причина
Издатель отправляет сообщения быстрее, чем читатель может их обработать.
Решение
Возможные способы устранения ошибок:
- Увеличьте кольцевой буфер издателя
capacityв определении архитектуры VSIDL, чтобыHistoryсохранял достаточное количество недавних сообщений для интервала опроса читателя. - Увеличьте частоту чтения из
Historyили уменьшите частоту отправки сообщений издателем.
InstantReader читает только последнее сообщение
Ошибка.
Сообщение потеряно до копирования истории. При чтении не показывается уведомление об ошибке.
Причина
Издатель отправляет сообщения быстрее, чем читатель может их обработать.
Решение
Н/Д
Клиент RPC вызывает метод, который недоступен.
Ошибка.
Вызов метода завершается ошибкой Unavailable.
Причина
SDV не знает имя сервера и возвращает Unavailable. Эта ошибка возвращается промежуточным ПО, если обнаружение сервисов не возвращает действительное имя сервера.
Решение
Запустите пакет сервисов, который определяет server для заданного интерфейса, который хочет использовать клиент.
Реализация на стороне сервера возвращает ошибку SdvStatus
Ошибка.
Серверная реализация возвращает SdvResult, содержащий ошибку SdvStatus, например SdvStatusCode::NotFound. Ошибка передается обратно вызывающему клиенту.
Причина
SDV и система связи между клиентом и сервером работают правильно, но клиент отправил запрос, который вызывает ошибку на сервере.
Решение
Отправьте действительный запрос с клиента или настройте сервер так, чтобы он успешно отвечал на эти запросы.