Ошибка вызова приемника прослушивателя сообщений JMS, Причина: Идентификатор содержит недопустимый символ идентификатора JMS '-': 'x-request-id'


9

Я работаю с JMS и очередями (очередями Azure) впервые. Мне нужно создать очередь, в которой сервер Rubi будет записывать некоторые данные, а Java будет читать их из очереди и будет выполнять дальнейшие выполнения. Этот процесс работает нормально на моей машине. Я создал конечную точку REST, которая записывает данные в очередь, и, как только данные записываются в очередь, слушатель получает и читает данные и выполняет их. Когда мы внедряем его в Azure, я вижу ошибку в журналах, которая не позволяет запускать очереди.

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

Zipkin также присутствует на сервере Azure как распределенная система трассировки, и я думаю, что это x-request-idсвязано с Zipkin, который создает проблему. Я искал в Google проблему, но не мог понять, почему это происходит.

Ниже приведено подробное сообщение об ошибке:

[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

Что такое "сервер Rubi" и как он записывает данные в очередь, которую вы пытаетесь использовать из своего клиента JMS?
Джастин Бертрам

Где фактическая ошибка в «подробном сообщении об ошибке», которое вы вставили? Это выглядит как отладочная регистрация.
Джастин Бертрам

Где код?
user207421

Ответы:


1

Из сообщения об ошибке очевидно, что вы используете JMS-клиент qpid для связи через очереди. Клиент qpid не допустит никаких ключей, которые нарушают соглашение об именовании переменных java, например, вы не сможете отправить x-request-id в заголовке очереди, который использует клиент qpid jms, поскольку он выдаст ошибку. Вам нужно позаботиться об istio / zipkin, чтобы не добавлять определенные заголовки (если они вам на самом деле не нужны) с очередью при попытке установить связь по шине Azure. Поэтому вы должны отключить библиотеки istio / zipkin для перехвата запроса на очереди, чтобы запрос в / из очереди мог выполняться без заголовков. Это решит проблему.


4

Раздел 3.5.1 спецификации JMS 2 утверждает это о свойствах сообщения:

Имена свойств должны соответствовать правилам для идентификатора селектора сообщений. См. Раздел 3.8 «Выбор сообщения» для получения дополнительной информации.

Что касается идентификаторов, в разделе 3.8.1.1 говорится, в частности:

Идентификатор - это последовательность символов неограниченной длины, которая должна начинаться с начального символа идентификатора Java; все последующие символы должны быть символами части идентификатора Java. Начальный символ идентификатора - это любой символ, для которого Character.isJavaIdentifierStartвозвращается метод true. Это включает в себя «_» и «$». Символ идентификатора - это любой символ, для которого Character.isJavaIdentifierPartвозвращается метод true.

Если вы передаете символ -в один Character.isJavaIdentifierStartили Character.isJavaIdentifierPartвозвращаемое значение false. Другими словами, символ в имени свойства сообщения нарушает спецификацию JMS и , следовательно , вызовет ошибку.-


0

Детали ошибки (трассировка стека Java) были бы действительно полезны здесь.

По сообщению об ошибке я предполагаю, что вы используете клиент qpid JMS , который выполняет проверку имен свойств сообщений. Эти имена могут содержать только символы, которые являются действительными символами идентификатора Java .

В строке 'queue-name' есть символ '-', который не является идентификатором Java. Чтобы исправить это, вам нужно изменить имя-очереди на что-то с допустимыми символами, например, «имя-очереди» (с подчеркиванием) или «имя-очереди» (случай верблюда).


1
Я обновил вопрос с подробным сообщением об ошибке. Мы можем видеть значения в заголовке (т.е. x-request-id) создает проблему. его добавление через istio. Но почему-то JMS не может их проанализировать.
Омар Бахир
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.