Je travaille avec JMS et les files d'attente (files d'attente Azure) pour la première fois. Je suis obligé de faire une file d'attente où le serveur Rubi écrirait des données et Java les lirait de la file d'attente et ferait d'autres exécutions. Ce processus fonctionne bien localement sur ma machine. J'ai créé un point de terminaison REST qui écrit des données dans la file d'attente et une fois les données écrites dans la file d'attente, l'écouteur prend le relais et lit les données et s'exécute. Lorsque nous le déployons sur Azure, l'erreur que je peux voir dans les journaux qui ne laisse pas démarrer les files d'attente est
Setup of JMS message listener invoker failed for destination 'queue' - trying to recover. Cause: Identifier contains invalid JMS identifier character '-': 'x-request-id'
Zipkin est également présent sur le serveur Azure en tant que système de suivi distribué et je suppose que cela x-request-id
est lié à Zipkin qui crée le problème. J'ai recherché le problème sur Google, mais je ne comprenais pas pourquoi cela se produisait.
Voici un message d'erreur détaillé:
[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
Réponses:
À partir du message d'erreur, il est évident que vous utilisez le client qpid JMS pour la communication via les files d'attente. Le client qpid n'autorisera aucune clé qui viole la convention de dénomination des variables java. Par exemple, vous ne pourrez pas envoyer x-request-id dans un en-tête de file d'attente que le client qpid jms consomme car cela générera une erreur. Vous devez prendre soin d'istio / zipkin pour ne pas ajouter certains en-têtes (id dont vous n'avez pas réellement besoin) avec la file d'attente lorsque vous essayez de communiquer sur un bus azur. Vous devez donc désactiver les bibliothèques istio / zipkin pour intercepter la demande de files d'attente afin que la demande vers / depuis la file d'attente puisse être effectuée sans en-têtes. Cela résoudra le problème.
la source
La section 3.5.1 de la spécification JMS 2 indique ceci à propos des propriétés de message:
En ce qui concerne les identifiants, la section 3.8.1.1 indique, en partie:
Si vous passez le caractère
-
dans l'unCharacter.isJavaIdentifierStart
ouCharacter.isJavaIdentifierPart
l' autre ou la valeur de retour estfalse
. En d'autres termes, le-
caractère dans le nom d'une propriété de message viole la spécification JMS et provoquera donc une erreur.la source
Les détails de l'erreur (trace de pile Java) seraient vraiment utiles ici.
Par message d'erreur, je suppose que vous utilisez le client Jpid qpid , qui effectue la vérification des noms des propriétés du message. Ces noms ne peuvent contenir que des caractères, qui sont des caractères d'identification Java valides .
Dans la chaîne 'queue-name' il y a un caractère '-', ce n'est pas l'identifiant Java. Pour résoudre ce problème, vous devez changer 'file d'attente-nom' en quelque chose avec des caractères valides, par exemple 'file d'attente_nom' (avec trait de soulignement), ou 'queueName' (cas de chameau).
la source