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-id
hä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
Antworten:
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.
quelle
In Abschnitt 3.5.1 der JMS 2-Spezifikation wird Folgendes zu den Nachrichteneigenschaften angegeben:
In Bezug auf Kennungen heißt es in Abschnitt 3.8.1.1 teilweise:
Wenn Sie das Zeichen
-
entweder übergebenCharacter.isJavaIdentifierStart
oderCharacter.isJavaIdentifierPart
der Rückgabewert istfalse
. Mit anderen Worten, das-
Zeichen im Namen einer Nachrichteneigenschaft verstößt gegen die JMS-Spezifikation und verursacht daher einen Fehler.quelle
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).
quelle