web-dev-qa-db-ja.com

ファイルから複数のメッセージをRabbitMQに公開する

単一のメッセージをRabbitMQキューに公開するには、メッセージをUIに配置して[メッセージを公開]ボタンをクリックするだけで、UIを使用して簡単に実行できます。

メッセージのバッチをどのように公開しますか?

RabbitMQに送信するメッセージを含むファイルがあります。各行には1つのメッセージがあります。

ファイルからすべてのメッセージをRabbitMQサーバーに公開するにはどうすればよいですか?

コマンドラインからそれを行う方法はありますか?

11
summerbulb

Rabbitmqadminの使用

while read -r line; do 
  echo $line | rabbitmqadmin publish exchange=amq.default routing_key=my_queue ; 
done < messages

ペイロードパラメータをrabbitmqadmin publishに指定しないと、標準入力からペイロードが読み取られます。

11
looseend

rabbitmqadmin cliツールを使用する必要があります:

https://www.rabbitmq.com/management-cli.html

rabbitmqadmin publish exchange=amq.default routing_key=test payload="hello, world"

7
aeryaguzov

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つのメッセージの例です。類推すると、スクリプトを記述できます

4
Oleg SH

ファイルコンテンツの公開をサポートするために、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"
_
1
Keynash

ルーズエンドからの回答のバリエーションとして、 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個のジョブで実行されます。必要がない場合は、ホストと資格情報を省略します。

1
Matt20013