JMS 메시지 리스너 호출자 실패, 원인 : ID에 유효하지 않은 JMS ID 문자 '-': '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 클라이언트에서 사용하려는 큐에 데이터를 쓰는 방법은 무엇입니까?
저스틴 버트 램

붙여 넣은 "세부 오류 메시지"에서 실제 오류는 어디에 있습니까? 디버그 로깅처럼 보입니다.
저스틴 버트 램

야호는 IS 코드는?
user207421

답변:


1

오류 메시지에서 큐를 통한 통신에 qpid JMS 클라이언트를 사용하고 있음이 분명합니다. qpid 클라이언트는 java 변수 명명 규칙을 위반하는 키를 허용하지 않습니다. 예를 들어 qpid jms 클라이언트가 소비하는 큐 헤더에서 x-request-id를 보낼 수 없으므로 오류가 발생합니다. Azure 버스에서 통신하려고 할 때 대기열에 특정 헤더 (실제로 필요하지 않은 ID)를 추가하지 않도록 istio / zipkin을 관리해야합니다. 따라서 큐 요청을 인터셉트하기 위해 istio / zipkin 라이브러리를 비활성화하여 헤더없이 큐에 요청을 할 수 있습니다. 문제가 해결됩니다.


4

JMS 2 사양의 3.5.1 절에는 메시지 속성에 대한 내용이 나와 있습니다.

속성 이름은 메시지 선택기 식별자 규칙을 따라야합니다. 자세한 내용은 3.8 절“메시지 선택”을 참조하십시오.

식별자와 관련하여 섹션 3.8.1.1은 다음과 같이 설명합니다.

식별자는 Java 식별자 시작 문자로 시작해야하는 무제한 길이의 문자 시퀀스입니다. 다음 문자는 모두 Java 식별자 부분 문자 여야합니다. 식별자 시작 문자는 메서드가 Character.isJavaIdentifierStart반환 하는 모든 문자입니다 true. 여기에는 '_'와 '$'가 포함됩니다. 식별자 부분 문자는 메소드가 Character.isJavaIdentifierPart리턴 하는 문자입니다 true.

문자 -를 하나에 전달 Character.isJavaIdentifierStart하거나 Character.isJavaIdentifierPart반환 값은 false입니다. 즉, 메시지 속성의 이름으로 문자가 JMS 사양을 위반 하기 때문에 오류가 발생합니다.-


0

오류 세부 정보 (자바 스택 추적)가 여기에 실제로 유용합니다.

오류 메시지 에 따르면 메시지 속성의 이름을 확인하는 qpid JMS 클라이언트를 사용하고 있다고 가정 합니다. 이 이름은 유효한 Java 식별자 문자 인 문자 만 포함 할 수 있습니다 .

문자열 'queue-name'에는 Java 식별자가 아닌 '-'문자가 있습니다. 수정하려면 'queue-name'을 유효한 문자 (예 : 'queue_name'(밑줄 포함) 또는 'queueName'(낙타 경우))로 변경해야합니다.


1
자세한 오류 메시지로 질문을 업데이트했습니다. 헤더의 값 (예 : x-request-id)이 문제를 일으키는 것을 볼 수 있습니다. istio를 통해 추가됩니다. 그러나 어떻게 든 JMS는이를 분석 할 수 없습니다.
Omar Bahir
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.