JMS 消息侦听器调用程序失败,原因:标识符包含无效的 JMS 标识符字符“-”:'x-request-id'

JMS message listener invoker failed, Cause: Identifier contains invalid JMS identifier character '-': '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

错误详细信息(Java 堆栈跟踪)在这里非常有用。

根据我假设的错误消息,您正在使用 qpid JMS client, that is performing check of message properties' names. These names can contain only characters, that are valid Java identifier characters

字符串'queue-name'中有一个'-'字符,不是Java标识符。要修复,您需要将 'queue-name' 更改为具有有效字符的内容,例如 'queue_name'(带下划线)或 'queueName'(驼峰式)。

JMS 2 规范的第 3.5.1 节对消息属性进行了说明:

Property names must obey the rules for a message selector identifier. See Section 3.8 “Message selection” for more information.

关于标识符,第 3.8.1.1 节部分指出:

An identifier is an unlimited-length character sequence that must begin with a Java identifier start character; all following characters must be Java identifier part characters. An identifier start character is any character for which the method Character.isJavaIdentifierStart returns true. This includes '_' and '$'. An identifier part character is any character for which the method Character.isJavaIdentifierPart returns true.

如果将字符 - 传递给 Character.isJavaIdentifierStartCharacter.isJavaIdentifierPart,则 return 的值为 false。换句话说,消息名称中的 - 字符 属性 违反了 JMS 规范,因此会导致错误。

从错误消息中可以明显看出您正在使用 qpid JMS 客户端通过 queues 进行通信。 qpid 客户端不允许任何违反 java 变量命名约定的键,例如您将无法在 queue 的 header 中发送 x-request-id 哪个 qpid jms 客户端正在消耗,因为它会抛出错误。 您需要注意 istio/zipkin,不要在 queue 尝试在 azure 总线上进行通信时添加某些 header(您实际上并不需要它们)。 因此,您必须禁用 istio/zipkin 库来拦截对 queue 的请求,以便可以在没有 header 的情况下发出请求 to/from queue。这将解决问题。