単一のメッセージをRabbitMQキューに公開するには、メッセージをUIに配置して[メッセージを公開]ボタンをクリックするだけで、UIを使用して簡単に実行できます。
メッセージのバッチをどのように公開しますか?
RabbitMQに送信するメッセージを含むファイルがあります。各行には1つのメッセージがあります。
ファイルからすべてのメッセージをRabbitMQサーバーに公開するにはどうすればよいですか?
コマンドラインからそれを行う方法はありますか?
Rabbitmqadminの使用
while read -r line; do
echo $line | rabbitmqadmin publish exchange=amq.default routing_key=my_queue ;
done < messages
ペイロードパラメータをrabbitmqadmin publish
に指定しないと、標準入力からペイロードが読み取られます。
rabbitmqadmin
cliツールを使用する必要があります:
https://www.rabbitmq.com/management-cli.html
rabbitmqadmin publish exchange=amq.default routing_key=test payload="hello, world"
curlおよびrabbitmq apiを使用できます。
curl -u login:pass -i -H "content-type:application/json" -X POST http://localhost:15672/api/exchanges/%2Fvhost/exchange/publish -d'{"properties":{},"routing_key":"","payload":"you message","payload_encoding":"string"}'
これは1つのメッセージの例です。類推すると、スクリプトを記述できます
ファイルコンテンツの公開をサポートするために、rabbitmqadminファイルを更新しました。 _EXTRA_VERBS = {
_とdef invoke_publish(self):
を含む行を見つけて、関連するコードを次のように更新してください
_EXTRA_VERBS = {
'publish': {'mandatory': ['routing_key'],
'optional': {'payload': None,
'pfile': None,
'properties': {},
'exchange': 'amq.default',
'payload_encoding': 'string'},
'json': ['properties'],
'uri': '/exchanges/{vhost}/{exchange}/publish'},
'get': {'mandatory': ['queue'],
'optional': {'count': '1', 'requeue': 'true',
'payload_file': None, 'encoding': 'auto'},
'uri': '/queues/{vhost}/{queue}/get'}
}
_
そして
_def invoke_publish(self):
(uri, upload) = self.parse_args(self.args, EXTRA_VERBS['publish'])
if not 'payload' and 'pfile' in upload:
data = sys.stdin.read()
upload['payload'] = b64(data)
upload['payload_encoding'] = 'base64'
Elif not 'payload' in upload:
with open('populate/' + upload['pfile']) as f: data = f.read()
upload['payload'] = b64(data)
upload['payload_encoding'] = 'base64'
resp = json.loads(self.post(uri, json.dumps(upload)))
if resp['routed']:
self.verbose("Message published")
else:
self.verbose("Message published but NOT routed")
_
絶対パスを使用してファイルを提供する場合は、次の行から_'populate/' +
_を削除します。
_with open('populate/' + upload['pfile']) as f: data = f.read()
_
Open(...)を更新しなくても、ファイルrules.jsonが相対ディレクトリ「populate」に配置されていると想定して、次のコマンドはうまく機能しました
_python rabbitmqadmin.py publish exchange=feed-mgmt-in routing_key='#' properties='{"type":"domain-collections/rules"}' pfile="rules.json"
_
ルーズエンドからの回答のバリエーションとして、 GNU Parallel を使用することもできます
これにより、ファイルが大きい場合のパフォーマンスが大幅に向上します。
cat messages | parallel -j 100 \
./rabbitmqadmin -H $RABBITMQ_Host \
-u $RABBITMQ_USERNAME \
-p $RABBITMQ_PASSWORD \
publish exchange=amq.default \
routing_key=myqueue \
payload="{}"
これは100個のジョブで実行されます。必要がない場合は、ホストと資格情報を省略します。