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

Я работаю с 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

person Omar Bahir    schedule 12.02.2020    source источник
comment
Что такое сервер Rubi и как он записывает данные в очередь, которую вы пытаетесь использовать из своего JMS-клиента?   -  person Justin Bertram    schedule 21.02.2020
comment
Где фактическая ошибка в подробном сообщении об ошибке, которое вы вставили? Это просто похоже на ведение журнала отладки.   -  person Justin Bertram    schedule 21.02.2020
comment
Где код?   -  person user207421    schedule 21.02.2020


Ответы (3)


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

person user11377504    schedule 25.02.2020

В разделе 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 и, следовательно, вызывает ошибку.

person Justin Bertram    schedule 21.02.2020

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

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

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

person AreSo    schedule 18.02.2020
comment
Я обновил вопрос с подробным сообщением об ошибке. Мы видим, что значения в заголовке (например, x-request-id) создают проблему. его добавление через istio. Но почему-то JMS не может их проанализировать. - person Omar Bahir; 18.02.2020