Wywołanie nasłuchiwania komunikatów JMS nie powiodło się, Przyczyna: Identyfikator zawiera niepoprawny znak identyfikatora JMS „-”: „x-request-id”

9

Pracuję z JMS i kolejkami (kolejki Azure) po raz pierwszy. Muszę utworzyć kolejkę, w której serwer Rubi zapisałby niektóre dane, a Java odczytałaby je z kolejki i wykonałaby dalsze operacje. Ten proces działa poprawnie lokalnie na moim komputerze. Utworzyłem punkt końcowy REST, który zapisuje dane w kolejce, a gdy dane zostaną zapisane w kolejce, odbiornik przejmie dane i odczyta je i wykona. Po wdrożeniu go na platformie Azure pojawia się błąd w dziennikach, który uniemożliwia uruchomienie kolejek

Setup of JMS message listener invoker failed for destination 'queue' - trying to recover. Cause: Identifier contains invalid JMS identifier character '-': 'x-request-id' 

Zipkin jest również obecny na serwerze Azure jako rozproszony system śledzenia i myślę, że x-request-idjest to związane z Zipkinem, który tworzy problem. Szukałem problemu w Google, ale nie mogłem zrozumieć, dlaczego tak się dzieje.

Poniżej znajduje się szczegółowy komunikat o błędzie:

[36mc.m.s.l.NextGenRequestLoggingFilter     [0;39m [2m:[0;39m 
Before request [uri=/services/deal-service/api/v2/deals/ack;headers= 
[x-request-id:"2d8d86d7-4fbf-9db6-8e95-28813f21a85c", 
x-envoy-internal:"true", x-b3-parentspanid:"a209cdc649b0b890", content- 
length:"575", x-forwarded-proto:"http", postman-token:"ad074595- 
76a5-474b-9711-7e071b12b3b0", x-b3-sampled:"1", x-forwarded- 
for:"10.244.2.1", accept:"*/*", 
authorization: "some-token-YJc4tg--34jPRziJNSACqNQ", x-b3- 
traceid:"6b40ff22781be67ba209cdc649b0b890", x-b3- 
spanid:"702684ddb62cfe6b", 
host:"portal-gateway.52.228.65.225.nip.io", 
cache-control:"no-cache", accept-encoding:"gzip, deflate, br", 
user-agent:"PostmanRuntime/7.22.0", 
Content-Type:"application/xml;charset=UTF-8"]]
2020-02-18T15:19:34.197666458Z [2m2020-02-18 15:19:34.197[0;39m  . 
[32mDEBUG 
[,6b40ff22781be67ba209cdc649b0b890,702684ddb62cfe6b,true][0;39m  . 
[35m9[0;39m [2m---[0;39m [2m[ XNIO-1 task-15][0;39m
Omar Bahir
źródło
Co to jest „serwer Rubi” i jak zapisuje dane do kolejki, którą próbujesz użyć z klienta JMS?
Justin Bertram
Gdzie jest rzeczywisty błąd w „szczegółowym komunikacie o błędzie”, który wkleiłeś? To po prostu wygląda na rejestrowanie debugowania.
Justin Bertram
Whee to kod?
user207421

Odpowiedzi:

1

Z komunikatu o błędzie wynika, że ​​używasz klienta Qpid JMS do komunikacji przez kolejki. Klient qpid nie zezwala na żadne klucze, które naruszają konwencję nazewnictwa zmiennych java, np. nie będziesz mógł wysłać x-request-id w nagłówku kolejki, który klient qpid jms zużywa, ponieważ spowoduje to błąd. Musisz zadbać o istio / zipkin, aby nie dodawać niektórych nagłówków (jeśli nie potrzebujesz ich tak naprawdę) do kolejki podczas próby komunikacji w lazurowej magistrali. Musisz więc wyłączyć biblioteki istio / zipkin, aby przechwycić żądanie kolejki, aby żądanie do / z kolejki mogło być wykonane bez nagłówków. To rozwiąże problem.

użytkownik11377504
źródło
4

Sekcja 3.5.1 specyfikacji JMS 2 mówi o właściwościach komunikatu:

Nazwy właściwości muszą być zgodne z regułami dla identyfikatora selektora wiadomości. Aby uzyskać więcej informacji, zobacz rozdział 3.8 „Wybór wiadomości”.

W odniesieniu do identyfikatorów sekcja 3.8.1.1 stanowi częściowo:

Identyfikator to ciąg znaków o nieograniczonej długości, który musi zaczynać się od znaku początkowego identyfikatora Java; wszystkie następujące znaki muszą być znakami części identyfikatora Java. Początkowy znak identyfikatora to dowolny znak, dla którego metoda Character.isJavaIdentifierStartzwraca true. Obejmuje to „_” i „$”. Częścią identyfikatora jest dowolny znak, dla którego metoda Character.isJavaIdentifierPartzwraca true.

Jeśli przekażesz znak -do któregokolwiek z nich Character.isJavaIdentifierStartlub Character.isJavaIdentifierPartzwrócona wartość to false. Innymi słowy, znaków w nazwie właściwości wiadomości jest niezgodny ze specyfikacją JMS , a tym samym spowoduje błąd.-

Justin Bertram
źródło
0

Bardzo przydatne byłyby tutaj szczegóły błędu (śledzenie stosu Java).

Zakładam, że komunikat o błędzie używa qpid klienta JMS , który wykonuje sprawdzenie nazw właściwości komunikatu. Nazwy te mogą zawierać tylko znaki, które są poprawnymi znakami identyfikacyjnymi Java .

W ciągu „nazwa kolejki” znajduje się znak „-”, który nie jest identyfikatorem Java. Aby to naprawić, musisz zmienić „nazwa kolejki” na coś z prawidłowymi znakami, na przykład „nazwa kolejki” (z podkreśleniem) lub „nazwa kolejki” (wielkość liter).

Są tak
źródło
1
Zaktualizowałem pytanie szczegółowym komunikatem o błędzie. Widzimy, że wartości w nagłówku (tj. X-request-id) tworzą problem. jest dodawany przez istio. Ale w jakiś sposób JMS nie może ich przeanalizować.
Omar Bahir