从文件向RabbitMQ发布多条消息

时间:2015-11-02 09:44:11

标签: file command-line rabbitmq message-queue publish-subscribe

通过简单地将消息放入UI并单击"发布消息"可以使用UI轻松地将单个消息发布到RabbitMQ队列。按钮。

如何发布一批邮件?

我有一个文件,其中包含要发送给RabbitMQ的消息。每行都有一条消息。

如何将文件中的所有消息发布到RabbitMQ服务器?

有没有办法从命令行执行此操作?

6 个答案:

答案 0 :(得分:8)

您需要使用rabbitmqadmin cli工具:

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

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

答案 1 :(得分:7)

使用rabbitmqadmin

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

未将有效负载参数指定为rabbitmqadmin publish表示它从stdin读取有效负载。

答案 2 :(得分:2)

您可以使用 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"}'

这是一个消息的示例,通过类比,您可以编写脚本

答案 3 :(得分: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()

没有更新打开(...)以下命令对我来说很好,假设文件rules.json被放置在相对目录中&#34;填充&#34;

python rabbitmqadmin.py publish exchange=feed-mgmt-in routing_key='#' properties='{"type":"domain-collections/rules"}' pfile="rules.json"

答案 4 :(得分:0)

作为松散答案的一种变体,您也可以使用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个作业。如果不需要,请省略主机和凭据。

答案 5 :(得分:-1)

只需使用amqp-tool

npm install amqp-tool -g

amqp-tool --host rabbitmq.local -u <user> -p <password> -q <queue name> --import file.json