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客户端尝试使用的队列中?
贾斯汀·伯特拉姆

您粘贴的“详细错误消息”中的实际错误在哪里?看起来就像一些调试日志记录。
贾斯汀·伯特拉姆

Whee是代码?
user207421

Answers:


1

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


4

JMS 2规范的3.5.1节声明了有关消息属性的内容:

属性名称必须遵守消息选择器标识符的规则。更多信息,请参见第3.8节“消息选择”。

关于标识符,第3.8.1.1节部分规定:

标识符是无限长度的字符序列,必须以Java标识符起始字符开头;以下所有字符必须是Java标识符部分字符。标识符起始字符是方法Character.isJavaIdentifierStart返回的任何字符true。这包括“ _”和“ $”。标识符部分字符是方法Character.isJavaIdentifierPart返回的任何字符 true

如果你传递字符-到要么Character.isJavaIdentifierStartCharacter.isJavaIdentifierPart返回值false。换句话说,消息属性名称中-字符违反了JMS规范,因此将导致错误。


0

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

根据我认为的错误消息,您正在使用qpid JMS client,它正在检查消息属性的名称。这些名称只能包含有效的Java标识符character字符

在字符串“ queue-name”中,有一个“-”字符,不是Java标识符。要解决此问题,您需要将“队列名称”更改为带有有效字符的名称,例如“ queue_name”(带下划线)或“ queueName”(驼峰式)。


1
我已更新问题,并附有详细的错误消息。我们可以看到标头(即x-request-id)中的值是造成问题的原因。它是通过istio添加的。但是JMS无法以某种方式解析这些内容。
奥马尔·巴希尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.