O invocador do ouvinte de mensagem JMS falhou. Causa: o identificador contém o caractere de identificador JMS inválido '-': 'x-request-id'

9

Estou trabalhando com JMS e filas (filas do Azure) pela primeira vez. Sou obrigado a criar uma fila em que o servidor Rubi gravará alguns dados e o Java os leria da fila e executaria mais. Esse processo está funcionando bem localmente na minha máquina. Eu criei um ponto de extremidade REST que está gravando dados na fila e, depois que os dados são gravados na fila, o ouvinte assume e lê os dados e executa. Quando o implantamos no Azure, o erro que vejo nos logs que não está permitindo o início das filas é

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

Zipkin também está presente no servidor do Azure como um sistema de rastreamento distribuído e acho que isso x-request-id está relacionado ao Zipkin, que está criando o problema. Pesquisei no Google pelo problema, mas não conseguia entender por que isso está acontecendo.

A seguir, é apresentada uma mensagem de erro detalhada:

[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
fonte
O que é "servidor Rubi" e como ele está gravando os dados na fila que você está tentando usar do seu cliente JMS?
Justin Bertram
Onde está o erro real na "mensagem de erro detalhada" que você colou? Isso parece com algum log de depuração.
Justin Bertram
Whee é o código?
user207421 21/02

Respostas:

1

Na mensagem de erro, é óbvio que você está usando o cliente qpid JMS para comunicação através de filas. O cliente qpid não permitirá nenhuma chave que viole a convenção de nomenclatura de variáveis ​​java, por exemplo, você não poderá enviar x-request-id no cabeçalho de uma fila que o cliente qpid jms esteja consumindo, pois causará erro. Você precisa cuidar do istio / zipkin para não adicionar determinados cabeçalhos (você realmente não precisa deles) com a fila quando estiver tentando se comunicar no barramento azul. Portanto, você deve desativar as bibliotecas istio / zipkin para interceptar a solicitação de filas, para que a solicitação de / para a fila possa ser feita sem cabeçalhos. Isso resolverá o problema.

user11377504
fonte
4

A seção 3.5.1 da especificação JMS 2 afirma isso sobre as propriedades da mensagem:

Os nomes de propriedades devem obedecer às regras para um identificador de seletor de mensagens. Consulte a Seção 3.8 "Seleção de mensagem" para obter mais informações.

Em relação aos identificadores, a seção 3.8.1.1 declara, em parte:

Um identificador é uma sequência de caracteres de tamanho ilimitado que deve começar com um caractere de início do identificador Java; todos os caracteres a seguir devem ser caracteres de parte do identificador Java. Um caractere inicial de identificador é qualquer caractere para o qual o método Character.isJavaIdentifierStartretorna true. Isso inclui '_' e '$'. Um caractere de parte do identificador é qualquer caractere para o qual o método Character.isJavaIdentifierPartretorna true.

Se você passar o caractere -para um Character.isJavaIdentifierStartou Character.isJavaIdentifierParto valor de retorno é false. Em outras palavras, o -caractere no nome de uma propriedade de mensagem viola a especificação JMS e, portanto, causará um erro.

Justin Bertram
fonte
0

Detalhes de erro (rastreamento de pilha Java) seriam realmente úteis aqui.

Por mensagem de erro, presumo que você esteja usando o cliente qpid JMS , que está executando a verificação dos nomes das propriedades da mensagem. Esses nomes podem conter apenas caracteres, que são caracteres identificadores Java válidos .

Na sequência 'nome da fila', há um caractere '-', que não é um identificador Java. Para corrigir, você precisa alterar 'nome da fila' em algo com caracteres válidos, por exemplo 'nome_da_filme' (com sublinhado) ou 'nome_da_filme' (caixa de camelo).

São tão
fonte
11
Atualizei a pergunta com uma mensagem de erro detalhada. Podemos ver valores no cabeçalho (ou seja, x-request-id) está criando o problema. está sendo adicionado através do istio. Mas, de alguma forma, o JMS não está conseguindo analisá-los.
Omar Bahir 18/02