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クライアントから使用しようとしているキューにデータをどのように書き込みますか?
ジャスティンバートラム

貼り付けた「詳細なエラーメッセージ」の実際のエラーはどこにありますか?これはデバッグログのように見えます。
ジャスティンバートラム

わーいあるコードは?
user207421

回答:


1

エラーメッセージから、キューを介した通信にqpid JMSクライアントを使用していることは明らかです。qpidクライアントは、Java変数の命名規則に違反するキーを許可しません。たとえば、qpid jmsクライアントがエラーをスローするために消費しているキューのヘッダーでx-request-idを送信できません。istio / zipkinを処理して、特定のヘッダー(実際には必要ありません)がAzureバスで通信しようとするときにキューに追加されないようにする必要があります。したがって、ヘッダーなしでキューとの間のリクエストを行えるように、キューのリクエストをインターセプトするには、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

エラーの詳細(Javaスタックトレース)は、ここで非常に役立ちます。

私が想定するエラーメッセージでは、メッセージプロパティの名前のチェックを実行している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.