Aufrufer des JMS-Nachrichten-Listeners fehlgeschlagen, Ursache: Bezeichner enthält ungültiges JMS-Bezeichnerzeichen '-': 'x-request-id'

9

Ich arbeite zum ersten Mal mit JMS und Warteschlangen (Azure-Warteschlangen). Ich muss eine Warteschlange erstellen, in der der Rubi-Server einige Daten schreibt und Java sie aus der Warteschlange liest und weitere Ausführungen durchführt. Dieser Prozess funktioniert lokal auf meinem Computer einwandfrei. Ich habe einen REST-Endpunkt erstellt, der Daten in die Warteschlange schreibt. Sobald Daten in die Warteschlange geschrieben wurden, übernahm der Listener die Daten, las sie und führte sie aus. Wenn wir es in Azure bereitstellen, wird der Fehler in Protokollen angezeigt, bei dem die Warteschlangen nicht gestartet werden

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

Zipkin ist auch auf dem Azure-Server als verteiltes Ablaufverfolgungssystem vorhanden, und ich denke, dies x-request-idhängt mit Zipkin zusammen, das das Problem verursacht. Ich habe Google nach dem Problem durchsucht, konnte aber nicht verstehen, warum es passiert.

Es folgt eine detaillierte Fehlermeldung:

[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
quelle
Was ist "Rubi-Server" und wie werden die Daten in die Warteschlange geschrieben, die Sie von Ihrem JMS-Client aus verwenden möchten?
Justin Bertram
Wo ist der tatsächliche Fehler in der "detaillierten Fehlermeldung", die Sie eingefügt haben? Das sieht aus wie eine Debug-Protokollierung.
Justin Bertram
Whee ist der Code?
user207421

Antworten:

1

Aus der Fehlermeldung geht hervor, dass Sie den qpid JMS-Client für die Kommunikation über Warteschlangen verwenden. Der qpid-Client lässt keine Schlüssel zu, die gegen die Namenskonvention für Java-Variablen verstoßen. Sie können beispielsweise keine x-request-id im Header einer Warteschlange senden, die der qpid-jms-Client verbraucht, da dies zu Fehlern führt. Sie müssen sich um istio / zipkin kümmern, um bestimmte Header (ID, die Sie eigentlich nicht benötigen) nicht zur Warteschlange hinzuzufügen, wenn versucht wird, über einen Azure-Bus zu kommunizieren. Sie müssen also die istio / zipkin-Bibliotheken deaktivieren, um die Anforderung von Warteschlangen abzufangen, damit die Anforderung an / von der Warteschlange ohne Header erfolgen kann. Dies wird das Problem beheben.

user11377504
quelle
4

In Abschnitt 3.5.1 der JMS 2-Spezifikation wird Folgendes zu den Nachrichteneigenschaften angegeben:

Eigenschaftsnamen müssen den Regeln für eine Nachrichtenauswahlkennung entsprechen. Weitere Informationen finden Sie in Abschnitt 3.8, „Nachrichtenauswahl“.

In Bezug auf Kennungen heißt es in Abschnitt 3.8.1.1 teilweise:

Ein Bezeichner ist eine Zeichenfolge mit unbegrenzter Länge, die mit einem Java-Bezeichner-Startzeichen beginnen muss. Alle folgenden Zeichen müssen Java-Bezeichnerteilzeichen sein. Ein Bezeichner-Startzeichen ist ein beliebiges Zeichen, für das die Methode Character.isJavaIdentifierStartzurückgibt true. Dies beinhaltet '_' und '$'. Ein Bezeichnerteilzeichen ist ein beliebiges Zeichen, für das die Methode Character.isJavaIdentifierPartzurückgibt true.

Wenn Sie das Zeichen -entweder übergeben Character.isJavaIdentifierStartoder Character.isJavaIdentifierPartder Rückgabewert ist false. Mit anderen Worten, das -Zeichen im Namen einer Nachrichteneigenschaft verstößt gegen die JMS-Spezifikation und verursacht daher einen Fehler.

Justin Bertram
quelle
0

Details zum Fehler (Java-Stack-Trace) wären hier sehr nützlich.

Ich gehe davon aus, dass Sie aufgrund einer Fehlermeldung einen qpid-JMS-Client verwenden , der die Namen der Nachrichteneigenschaften überprüft. Diese Namen dürfen nur Zeichen enthalten, die gültige Java-Bezeichner sind .

In der Zeichenfolge 'Warteschlangenname' gibt es ein '-' Zeichen, das keine Java-Kennung ist. Um dies zu beheben, müssen Sie 'Warteschlangenname' in etwas mit gültigen Zeichen ändern, z. B. 'Warteschlangenname' (mit Unterstrich) oder 'Warteschlangenname' (Kamelfall).

Sind so
quelle
1
Ich habe die Frage mit einer detaillierten Fehlermeldung aktualisiert. Wir können sehen, dass Werte im Header (dh x-request-id) das Problem verursachen. es wird durch istio hinzugefügt. Aber irgendwie kann JMS diese nicht analysieren.
Omar Bahir