Richiamatore del listener di messaggi JMS non riuscito, Causa: l'identificatore contiene un carattere identificativo JMS non valido '-': 'x-request-id'


9

Sto lavorando con JMS e le code (code di Azure) per la prima volta. Mi viene richiesto di creare una coda in cui il server Rubi scriverà alcuni dati e Java lo leggerà dalla coda e eseguirà ulteriori esecuzioni. Questo processo funziona correttamente localmente sulla mia macchina. Ho creato un endpoint REST che sta scrivendo i dati nella coda e una volta che i dati sono scritti nella coda, l'ascoltatore prenderà il controllo e leggerà i dati ed eseguirà. Quando lo distribuiamo in Azure, l'errore che posso vedere nei registri che non consente l'avvio delle code è

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

Zipkin è presente anche sul server Azure come sistema di traccia distribuito e immagino questo x-request-id sia correlato a Zipkin che sta creando il problema. Ho cercato su Google il problema ma non riuscivo a capire perché stesse accadendo.

Di seguito è riportato un messaggio di errore dettagliato:

[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

Che cos'è il "server Rubi" e come sta scrivendo i dati nella coda che si sta tentando di utilizzare dal proprio client JMS?
Justin Bertram,

Dov'è l'errore reale nel "messaggio di errore dettagliato" che hai incollato? Sembra proprio una registrazione di debug.
Justin Bertram il

Whee è il codice?
user207421

Risposte:


1

Dal messaggio di errore è ovvio che si sta utilizzando il client JMS qpid per la comunicazione attraverso le code. Il client qpid non consentirà alcuna chiave che viola la convenzione di denominazione delle variabili java, ad esempio non sarà possibile inviare x-request-id nell'intestazione di una coda che il client qpid jms sta consumando poiché genererà un errore. Devi prenderti cura di istio / zipkin per non aggiungere determinate intestazioni (id che in realtà non ti servono) con la coda quando cerca di comunicare sul bus azzurro. Quindi devi disabilitare le librerie istio / zipkin per intercettare la richiesta di code in modo che la richiesta da / a coda possa essere fatta senza intestazioni. Questo risolverà il problema.


4

La sezione 3.5.1 della specifica JMS 2 lo afferma sulle proprietà del messaggio:

I nomi delle proprietà devono rispettare le regole per un identificatore del selettore messaggi. Vedere la Sezione 3.8 "Selezione dei messaggi" per ulteriori informazioni.

Per quanto riguarda gli identificatori, la sezione 3.8.1.1 afferma, in parte:

Un identificatore è una sequenza di caratteri di lunghezza illimitata che deve iniziare con un carattere iniziale dell'identificatore Java; tutti i seguenti caratteri devono essere caratteri di parte identificatore Java. Un carattere iniziale identificativo è qualsiasi carattere per cui il metodo Character.isJavaIdentifierStartrestituisce true. Ciò include '_' e '$'. Un carattere di parte identificatore è qualsiasi carattere per cui Character.isJavaIdentifierPartrestituisce il metodo true.

Se passi il personaggio -in uno dei due Character.isJavaIdentifierStarto Character.isJavaIdentifierPartil valore di ritorno è false. In altre parole, il -carattere nel nome di una proprietà del messaggio viola la specifica JMS e quindi causerà un errore.


0

I dettagli dell'errore (traccia stack Java) sarebbero davvero utili qui.

Per messaggio di errore presumo, stai utilizzando il client JMS qpid , che sta eseguendo il controllo dei nomi delle proprietà dei messaggi. Questi nomi possono contenere solo caratteri, che sono caratteri identificativi Java validi .

Nella stringa 'nome-coda' c'è un carattere '-', che non è un identificatore Java. Per risolvere, è necessario modificare "nome-coda" in qualcosa con caratteri validi, ad esempio "nome_coda" (con trattino basso) o "nomeCoda" (caso cammello).


1
Ho aggiornato la domanda con un messaggio di errore dettagliato. Possiamo vedere i valori nell'intestazione (cioè x-request-id) sta creando il problema. viene aggiunto tramite istio. Ma in qualche modo JMS non è in grado di analizzarli.
Omar Bahir,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.