Échec de l'appel de l'écouteur de messages JMS, cause: l'identifiant contient un caractère identificateur JMS non valide '-': 'x-request-id'

9

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
Omar Bahir
la source
Qu'est-ce que le "serveur Rubi" et comment écrit-il les données dans la file d'attente que vous essayez d'utiliser à partir de votre client JMS?
Justin Bertram
Où est l'erreur réelle dans le "message d'erreur détaillé" que vous avez collé? Cela ressemble à une journalisation de débogage.
Justin Bertram
Où est le code?
user207421

Réponses:

1

À 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.

user11377504
la source
4

La section 3.5.1 de la spécification JMS 2 indique ceci à propos des propriétés de message:

Les noms de propriété doivent respecter les règles pour un identificateur de sélecteur de message. Voir la section 3.8 «Sélection des messages» pour plus d'informations.

En ce qui concerne les identifiants, la section 3.8.1.1 indique, en partie:

Un identifiant est une séquence de caractères de longueur illimitée qui doit commencer par un caractère de début d'identifiant Java; tous les caractères suivants doivent être des caractères de partie d'identificateur Java. Un caractère de début d'identifiant est tout caractère pour lequel la méthode Character.isJavaIdentifierStartrenvoie true. Cela inclut «_» et «$». Un caractère de partie identifiant est tout caractère pour lequel la méthode Character.isJavaIdentifierPartrenvoie true.

Si vous passez le caractère -dans l'un Character.isJavaIdentifierStartou Character.isJavaIdentifierPartl' autre ou la valeur de retour est false. 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.

Justin Bertram
la source
0

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).

Sont tellement
la source
1
J'ai mis à jour la question avec un message d'erreur détaillé. Nous pouvons voir des valeurs dans l'en-tête (ie x-request-id) crée le problème. son ajouté par l'istio. Mais d'une manière ou d'une autre, JMS n'est pas en mesure de les analyser.
Omar Bahir