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 stan błędu, często identyfikowany przez kod błędu, np. Internal, Unavailable lub DataLoss.
Na tej stronie znajdziesz informacje, które pomogą Ci rozwiązać problemy związane 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 zarejestrować dokładnie tę samą instancję pakietu usług (nazwę i identyfikator instancji) dwa razy.
Rozwiązanie:
Nie próbuj rejestrować dokładnie tej samej instancji pakietu usług (nazwy i identyfikatora instancji) dwa razy.
Nie można usunąć duplikatu 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 wartość none.
Przyczyna:
Dwukrotnie wywołałeś(-aś) funkcję take_publisher() dla tego samego wariantu z tej samej instancji pakietu usług.
Rozwiązanie:
Nie wywołuj funkcji take_publisher() 2 razy w przypadku tej samej odmiany z tej samej instancji pakietu usług.
Nie można utworzyć subskrybenta, obserwatora, historii ani czytnika 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ć Subscriber, Observer, History lub InstantReader dla wydawcy, 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 serwer publikujący wyrejestruje się, a jego czytniki są nadal aktywne.
Funkcja read_next_messages() subskrybenta zwraca puste listy
Błąd:
read_next_messages() się powiedzie, ale zwróci puste listy.
Przyczyna:
Wydawca zostanie wyrejestrowany, gdy jego czytelnicy będą aktywni.
Rozwiązanie:
Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość w strumieniu dostępności jest niedostępna, wydawca zostanie wyrejestrowany i nie będą dostępne żadne nowe wiadomości.
Metoda next() obserwatora zwraca błąd wewnętrzny
Błąd:
next() zwraca błąd Internal.
Przyczyna:
Wydawca zostanie wyrejestrowany, gdy jego czytelnicy będą aktywni.
Rozwiązanie:
Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość w strumieniu dostępności jest niedostępna, wydawca zniknął i nie ma nowych wiadomości.
Funkcja read_from_history() w historii nie zwraca nowych wiadomości
Błąd:
read_from_history() nie zwraca żadnych nowych wiadomości, tylko starsze.
Przyczyna:
Wydawca zostanie wyrejestrowany, gdy jego czytelnicy będą aktywni.
Rozwiązanie:
Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość w strumieniu dostępności jest niedostępna, wydawca zniknął i nie ma nowych wiadomości.
Funkcja InstantReader read_latest_message() zwraca błąd wewnętrzny
Błąd:
read_latest_message() zwraca błąd Internal.
Przyczyna:
Wydawca zostanie wyrejestrowany, gdy jego czytelnicy będą aktywni.
Rozwiązanie:
Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość w strumieniu dostępności jest niedostępna, wydawca zniknął i nie ma nowych wiadomości.
Rozwiązywanie problemów z pustą kolejką wiadomości
Błędy mogą wystąpić podczas próby odczytu z pustej kolejki wiadomości.
Funkcja read_next_messages() subskrybenta zwraca pustą listę
Błąd:
read_next_messages() zwraca pustą listę.
Przyczyna:
Wydawca jest aktywny, ale nie wysłał żadnych wiadomości.
Rozwiązanie:
Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość w strumieniu dostępności jest dostępna, wydawca jest aktywny i nie ma nowych wiadomości.
Metoda next() obserwatora zwraca błąd wewnętrzny
Błąd:
next() zwraca błąd Internal.
Przyczyna:
Wydawca jest aktywny, ale nie wysłał żadnych wiadomości.
Rozwiązanie:
Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość w strumieniu dostępności jest dostępna, wydawca jest aktywny i nie ma nowych wiadomości.
Funkcja read_from_history() w historii nie zwraca nowych wiadomości
Błąd:
read_from_history() zwraca pustą listę.
Przyczyna:
Wydawca jest aktywny, ale nie wysłał żadnych wiadomości.
Rozwiązanie:
Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość w strumieniu dostępności jest dostępna, wydawca jest aktywny i nie ma nowych wiadomości.
Funkcja 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ł żadnych wiadomości.
Rozwiązanie:
Użyj subskrybenta lub historii ze strumieniem dostępności. Jeśli ostatnia wiadomość w strumieniu 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 serwer publikujący wysyła wiadomości szybciej niż czytnik jest w stanie je przetwarzać.
Pierwsze odczytanie przez subskrybenta po przepełnieniu zwraca błąd DataLoss
Błąd:
read_next_message() zwraca błąd DataLoss.
Przyczyna:
Wydawca wysyła wiadomości szybciej, niż czytelnik jest w stanie je przetworzyć.
Rozwiązanie:
Pierwsze wywołanie 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 jest w stanie je przetworzyć.
Rozwiązanie: możliwe poprawki to:
Wydawca publikuje z mniejszą częstotliwością. 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 co najwyżej 1 wiadomość na zmianę.
Zamiast obserwatora użytkownik korzysta z obiektu
InstantRead. ObiektInstantReadnie zwraca błędów przepełnienia i zawsze zwraca ostatnią wiadomość. Jeśli zależy Ci tylko na ostatniej wiadomości, 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) jest w stanie je odczytać, możesz utworzyć nowego wydawcę (P2) i obserwatora (O2), aby uwzględnić różnicę w szybkości publikowania i odczytywania.
Załóżmy na przykład, że proces P1 publikuje wiadomość co 10 ms, ale proces O1 może odczytać tylko jedną wiadomość co 100 ms i odrzuca pozostałe 9 wiadomości. Aby rozwiązać tę rozbieżność, utwórz rozwiązanie, które będzie wykonywać te czynności:
- P1 publikuje wiadomości w O2.
- O2 odczytuje jedną wiadomość i odrzuca dziewięć.
- O2 wysyła do P2 jedną odczytaną wiadomość.
- P2 wysyła do O1 1 przeczytaną wiadomość.
- O1 odczytuje jedną wiadomość co 10 sekund.
Poniższy przykładowy kod pokazuje, jak zaimplementować 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 ++; } }
Historia jest niekompletna
Błąd:
Wiadomość zostanie utracona przed skopiowaniem historii. Brak bezpośredniego powiadomienia o błędzie podczas odczytywania.
Przyczyna:
Wydawca wysyła wiadomości szybciej, niż czytelnik jest w stanie je przetworzyć.
Rozwiązanie:
Instant Reader odczytuje tylko ostatnią wiadomość
Błąd:
Wiadomość zostanie utracona przed skopiowaniem historii. Brak bezpośredniego powiadomienia o błędzie podczas odczytywania.
Przyczyna:
Wydawca wysyła wiadomości szybciej, niż czytelnik jest w stanie je przetworzyć.
Rozwiązanie:
Nie dotyczy
Klient RPC wywołuje metodę, która jest niedostępna
Błąd:
Wywołanie metody kończy się niepowodzeniem z błędem Unavailable.
Przyczyna:
SDV nie zna nazwy serwera i zwraca 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, z którego klient chce korzystać.
Implementacja po stronie serwera zwraca błąd SdvStatus
Błąd:
Implementacja po stronie serwera zwraca obiekt SdvResult zawierający SdvStatus
błąd, 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 spowodowało 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.