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

Я работаю с 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 связано с Зипкиным, который создает проблему. Я искал в 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

Ответы [ 3 ]

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

1 голос
/ 25 февраля 2020

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

0 голосов
/ 18 февраля 2020

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...