Я работаю с 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
Ответы:
Из сообщения об ошибке очевидно, что вы используете JMS-клиент qpid для связи через очереди. Клиент qpid не допустит никаких ключей, которые нарушают соглашение об именовании переменных java, например, вы не сможете отправить x-request-id в заголовке очереди, который использует клиент qpid jms, поскольку он выдаст ошибку. Вам нужно позаботиться об istio / zipkin, чтобы не добавлять определенные заголовки (если они вам на самом деле не нужны) с очередью при попытке установить связь по шине Azure. Поэтому вы должны отключить библиотеки istio / zipkin для перехвата запроса на очереди, чтобы запрос в / из очереди мог выполняться без заголовков. Это решит проблему.
источник
Раздел 3.5.1 спецификации JMS 2 утверждает это о свойствах сообщения:
Что касается идентификаторов, в разделе 3.8.1.1 говорится, в частности:
Если вы передаете символ
-
в одинCharacter.isJavaIdentifierStart
илиCharacter.isJavaIdentifierPart
возвращаемое значениеfalse
. Другими словами, символ в имени свойства сообщения нарушает спецификацию JMS и , следовательно , вызовет ошибку.-
источник
Детали ошибки (трассировка стека Java) были бы действительно полезны здесь.
По сообщению об ошибке я предполагаю, что вы используете клиент qpid JMS , который выполняет проверку имен свойств сообщений. Эти имена могут содержать только символы, которые являются действительными символами идентификатора Java .
В строке 'queue-name' есть символ '-', который не является идентификатором Java. Чтобы исправить это, вам нужно изменить имя-очереди на что-то с допустимыми символами, например, «имя-очереди» (с подчеркиванием) или «имя-очереди» (случай верблюда).
источник