我是第一次使用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有关,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

最佳答案

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

10-08 08:39