2015-12-10 14 views
7

ウェブ管理プラグインをインストールしたRabbitMQ 3.4.2 instanceがあります。Webプラグインを使用してJSONペイロードをRabbitMQに送信するにはどうすればよいですか?

Pythonのkombuキューパッケージを使用してメッセージ{'operationId': 194}をキューにプッシュすると、そのメッセージは辞書として読み取られます。

しかし、私は、Webコンソールを使用してメッセージを送信する場合:enter image description here

I取得し、受信側で次のエラー:私はcontent-typeヘッダを追加しようとしている

operation_id = payload['operationId'] 
TypeError: string indices must be integers 

とプロパティ、成功なし。

リーダコードが同じであるため、送信されたメッセージにJSON /ディクショナリペイロードとしてマークされないため、もう一方の側で文字列として読み取られることを意味します。

RabbitMQ Webコンソールを使用してメッセージをJSONメッセージとしてマークするにはどうすればよいですか?

答えて

13

content-type(ハイフンの代わりにアンダースコア)の代わりにcontent_typeを使用する必要がありました。

誰もが知っている標準がcontent-typeなので、これはかなり疑わしい設計上の決定です。

enter image description here

+0

HTTPヘッダーではありません...そのキーと区別し、そのプロパティにアンダースコアを使用するRabbitMQ規約に従います。 – Jakub

1

出力を逆シリアル化する必要があります。

import json 
payload = json.loads(payload) 
operation_id = payload['operationId'] 

さらに、{'operationId': 194}は有効なJSONではありません。スクリーンショットでは二重引用符を使用するように見えますが、一重引用符を二重引用符で置き換えてください。

編集: あなたは正しいので、こんにちはこれを処理する必要があります。コードを見ると、ヘッダーで大文字と小文字が区別される可能性があります。プロパティのヘッダーをContent-Typeからcontent-typeに変更します。

+0

面白いことは、Pythonコードから送信されたメッセージは、受信側には、逆シリアル化を必要としないことです。したがって、私には仕事をするメタデータがいくつかあると思います。 '{'operationId':194} 'を送信すると、相手側の辞書として受信されます。 Webコンソールから送信するときにもこの動作をしたいと思っています。 –

+0

@AdamMatanあなたはそうです。私はヘッダーの名前が大文字と小文字を区別しているほど馬鹿だと思う。 – eandersson

+0

私はそれを拾っていたはずです。私自身のamqpライブラリに '' '_''を使って同じ実装をしています。 https://github.com/eandersson/amqp-storm/blob/master/amqpstorm/message.py#L208 – eandersson