Większość interfejsów API oprogramowania pośredniczącego zwraca obiekt SdvResult. W przypadku powodzenia ten obiekt zawiera oczekiwany obiekt wyniku. W przypadku niepowodzenia ten obiekt zawiera obiekt SdvStatus, który wskazuje nieoczekiwane zachowanie lub błąd, często identyfikowany przez kod błędu, taki jak Internal, Unavailable lub DataLoss.
Na tej stronie znajdziesz informacje o tym, jak rozwiązywać problemy z tymi kodami błędów.
Rozwiązywanie problemów z rejestracją i tworzeniem
Błędy rejestracji i tworzenia zwykle występują, gdy próbujesz utworzyć lub zarejestrować nieprawidłową usługę.
Nie można utworzyć drugiej usługi
Błąd:
Internal błąd.
Przyczyna:
Próbujesz dwukrotnie zarejestrować dokładnie tę samą instancję pakietu usług (nazwę i identyfikator instancji).
Rozwiązanie:
Nie próbuj rejestrować tej samej instancji pakietu usług (nazwa i identyfikator instancji) dwukrotnie.
Nie można usunąć zduplikowanego pakietu usług
Błąd:
Status(-3, EX_ILLEGAL_ARGUMENT)
Przyczyna:
Próbujesz usunąć zduplikowany pakiet usług, który nie istnieje.
Rozwiązanie:
Nie próbuj usuwać zduplikowanego pakietu usług, który nie istnieje.
Nie można pobrać instancji wydawcy do wysyłania wiadomości
Błąd:
Wywołanie funkcji take_publisher zwraca none.
Przyczyna:
Metoda take_publisher została wywołana dwukrotnie dla tego samego wariantu z tej samej instancji pakietu usług.
Rozwiązanie:
Nie wywołuj metody take_publisher dwukrotnie dla tego samego wariantu z tej samej instancji pakietu usług.
Nie można utworzyć subskrybenta, obserwatora, historii ani InstantReader
Błąd:
Unavailable błąd.
Przyczyna:
Próbowano utworzyć Subscriber, Observer, History lub InstantReader dla wydawcy, który nie istnieje lub został wyrejestrowany.
Rozwiązanie:
Zanim spróbujesz utworzyć dla wydawcy Subscriber, Observer, History lub InstantReader, sprawdź, czy wydawca istnieje lub jest zarejestrowany.
Nie można utworzyć klienta RPC
Błąd:
Unavailable błąd
Przyczyna:
Próbowano utworzyć klienta RPC dla nazwy jednostki serwera, która nie istnieje lub nie jest zarejestrowana.
Rozwiązanie:
Przed utworzeniem klienta RPC sprawdź, czy serwer istnieje i jest zarejestrowany.
Rozwiązywanie problemów z komunikacją
Błędy komunikacji mogą wystąpić po wykonaniu usługi i rozpoczęciu komunikacji z innymi usługami.
Rozwiązywanie problemów z wyrejestrowaniem wydawcy
Błędy mogą wystąpić, gdy wydawca wyrejestruje się, gdy jego czytniki są nadal aktywne.
Metoda read_next_messages subskrybenta zwraca puste listy
Błąd:
read_next_messages kończy się powodzeniem, ale zwraca puste listy.
Przyczyna:
Wydawca został wyrejestrowany, gdy jego czytelnicy byli aktywni.
Rozwiązanie:
Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość strumienia dostępności jest niedostępna, wydawca jest wyrejestrowany i nie ma nowych wiadomości.
Metoda next obiektu Observer zwraca błąd wewnętrzny
Błąd:
next zwraca błąd Internal.
Przyczyna:
Wydawca został wyrejestrowany, gdy jego czytelnicy byli aktywni.
Rozwiązanie:
Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość strumienia dostępności jest niedostępna, oznacza to, że wydawca nie jest już dostępny i nie ma nowych wiadomości.
Funkcja read_from_history nie zwraca nowych wiadomości
Błąd:
read_from_history nie zwraca żadnych nowych wiadomości, tylko starsze.
Przyczyna:
Wydawca został wyrejestrowany, gdy jego czytelnicy byli aktywni.
Rozwiązanie:
Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość strumienia dostępności jest niedostępna, oznacza to, że wydawca nie jest już dostępny i nie ma nowych wiadomości.
InstantReader read_latest_message zwraca błąd wewnętrzny
Błąd:
read_latest_message zwraca błąd Internal.
Przyczyna:
Wydawca został wyrejestrowany, gdy jego czytelnicy byli aktywni.
Rozwiązanie:
Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość strumienia dostępności jest niedostępna, oznacza to, że wydawca nie jest już dostępny i nie ma nowych wiadomości.
Rozwiązywanie problemów z pustą kolejką wiadomości
Podczas próby odczytu z pustej kolejki wiadomości mogą wystąpić błędy.
Funkcja read_next_messages subskrybenta zwraca pustą listę
Błąd:
read_next_messages zwraca pustą listę.
Przyczyna:
Wydawca jest aktywny, ale nie wysłał wiadomości.
Rozwiązanie:
Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość strumienia dostępności jest dostępna, wydawca jest aktywny i nie ma nowych wiadomości.
Metoda next obiektu Observer zwraca błąd wewnętrzny
Błąd:
next zwraca błąd Internal.
Przyczyna:
Wydawca jest aktywny, ale nie wysłał wiadomości.
Rozwiązanie:
Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość strumienia dostępności jest dostępna, wydawca jest aktywny i nie ma nowych wiadomości.
Funkcja read_from_history nie zwraca nowych wiadomości
Błąd:
read_from_history zwraca pustą listę.
Przyczyna:
Wydawca jest aktywny, ale nie wysłał wiadomości.
Rozwiązanie:
Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość strumienia dostępności jest dostępna, wydawca jest aktywny i nie ma nowych wiadomości.
InstantReader read_latest_message zwraca błąd wewnętrzny
Błąd:
read_latest_message zwraca błąd Internal.
Przyczyna:
Wydawca jest aktywny, ale nie wysłał wiadomości.
Rozwiązanie:
Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość strumienia dostępności jest dostępna, wydawca jest aktywny i nie ma nowych wiadomości.
Rozwiązywanie problemów z przepełnieniem bufora lub utratą danych
Błędy mogą wystąpić, gdy wydawca wysyła wiadomości szybciej, niż czytelnik może je przetworzyć.
Pierwszy odczyt subskrybenta po przepełnieniu zwraca błąd DataLoss
Błąd:
read_next_messages zwraca błąd DataLoss.
Przyczyna:
Wydawca wysyła wiadomości szybciej, niż czytelnik może je przetworzyć.
Rozwiązanie:
Możliwe rozwiązania:
- Zwiększ bufor pierścieniowy wydawcy
capacityw definicji architektury VSIDL, aby kolejka mogła przyjmować serie wiadomości, zanim subskrybent je odczyta. - Zwiększ częstotliwość wykorzystywania wiadomości przez subskrybenta lub zmniejsz częstotliwość wysyłania wiadomości przez wydawcę.
- Jeśli Twoja usługa potrzebuje tylko najnowszej wartości wiadomości i nie musi przetwarzać każdej aktualizacji pośredniej, użyj
InstantReaderzamiastSubscriber.
Pierwsza metoda next obserwatora po przepełnieniu zwraca błąd DataLoss
Błąd:
next zwraca błąd DataLoss.
Przyczyna:
Wydawca wysyła wiadomości szybciej, niż czytelnik może je przetworzyć.
Rozwiązanie:
Możliwe rozwiązania:
Wydawca publikuje rzadziej. Możesz na przykład mieć zmienną z sygnaturą czasową ostatniej wiadomości. Jeśli bieżący czas jest mniejszy niż ostatni czas publikacji plus delta, nie publikujesz wiadomości. Dzięki temu mechanizmowi publikowana jest maksymalnie 1 wiadomość na delta.
Konsument używa obiektu
InstantReadzamiast obserwatora. ObiektInstantReadnie zwraca błędów przepełnienia i zawsze zwraca ostatnią wiadomość. Jeśli interesuje Cię tylko ostatnia wiadomość, możesz użyć obiektuInstantReadzamiast obserwatora.Konsument wdraża próbkowanie. Jeśli Twoje rozwiązanie ma wydawcę (P1), który publikuje wiadomości szybciej, niż obserwator (O1) może je odczytać, możesz utworzyć nowego wydawcę (P2) i obserwatora (O2), aby dostosować różnicę w szybkości publikowania i odczytywania.
Załóżmy na przykład, że P1 publikuje wiadomość co 10 ms, ale O1 może odczytać tylko 1 wiadomość co 100 ms i odrzuca pozostałe 9 wiadomości. Aby rozwiązać problem z rozbieżnością, utwórz rozwiązanie, które wykonuje te czynności:
- P1 publikuje wiadomości w O2.
- O2 odczytuje 1 wiadomość i odrzuca 9.
- O2 wysyła do P2 1 wiadomość o odczytaniu.
- P2 wysyła do O1 jedną przeczytaną wiadomość.
- O1 odczytuje jedną wiadomość co 10 sekund.
Poniższy przykładowy kod pokazuje, jak wdrożyć ten scenariusz próbkowania:
int discarded_message = 10; while (true) { message m = O2.read_message(); if discarded_message == 10 { discarded_message = 0; P2.publish(m); } else { discarded_message ++; } }
Odczyty historii są niekompletne
Błąd:
Wiadomość została utracona przed skopiowaniem historii. Brak bezpośredniego powiadomienia o błędzie podczas odczytu.
Przyczyna:
Wydawca wysyła wiadomości szybciej, niż czytelnik może je przetworzyć.
Rozwiązanie:
Możliwe rozwiązania:
- Zwiększ bufor pierścieniowy wydawcy
capacityw definicji architektury VSIDL, aby usługaHistoryzachowywała wystarczającą liczbę ostatnich wiadomości na potrzeby interwału odpytywania czytnika. - Odczytuj z
Historyczęściej lub zmniejsz częstotliwość wysyłania wiadomości przez wydawcę.
InstantReader odczytuje tylko ostatnią wiadomość
Błąd:
Wiadomość została utracona przed skopiowaniem historii. Brak bezpośredniego powiadomienia o błędzie podczas odczytu.
Przyczyna:
Wydawca wysyła wiadomości szybciej, niż czytelnik może je przetworzyć.
Rozwiązanie:
Nie dotyczy
Klient RPC wywołuje metodę, która jest niedostępna
Błąd:
Wywołanie metody nie powiodło się i wystąpił błąd Unavailable.
Przyczyna:
SDV nie zna nazwy serwera i zwraca błąd Unavailable. Ten błąd jest zwracany przez oprogramowanie pośredniczące, jeśli wykrywanie usług nie zwraca prawidłowej nazwy serwera.
Rozwiązanie:
Uruchom pakiet usług, który definiuje server dla danego interfejsu, którego klient chce używać.
Implementacja po stronie serwera zwraca błąd SdvStatus
Błąd:
Implementacja po stronie serwera zwraca błąd SdvResult zawierający błąd SdvStatus, np. SdvStatusCode::NotFound. Błąd jest przekazywany z powrotem do klienta wywołującego.
Przyczyna:
SDV i system komunikacji między klientem a serwerem działają zgodnie z oczekiwaniami, ale klient wysłał żądanie, które wywołuje błąd na serwerze.
Rozwiązanie:
Wyślij prawidłowe żądanie za pomocą klienta lub napraw serwer, aby mógł prawidłowo odpowiadać na te żądania.