File 从一个文件向RabbitMQ发布多条消息

File 从一个文件向RabbitMQ发布多条消息,file,command-line,rabbitmq,message-queue,publish-subscribe,File,Command Line,Rabbitmq,Message Queue,Publish Subscribe,使用UI可以轻松地将单个消息发布到RabbitMQ队列,只需将消息放入UI并单击“发布消息”按钮即可 如何发布一批消息 我有一个包含要发送到RabbitMQ的消息的文件。每行有一条信息 如何将文件中的所有消息发布到RabbitMQ服务器 有没有从命令行执行此操作的方法?您需要使用rabbitmqadmincli工具: rabbitmqadmin publish exchange=amq.default routing\u key=test payload=“hello,world”只需使用:

使用UI可以轻松地将单个消息发布到RabbitMQ队列,只需将消息放入UI并单击“发布消息”按钮即可

如何发布一批消息

我有一个包含要发送到RabbitMQ的消息的文件。每行有一条信息

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


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

您需要使用
rabbitmqadmin
cli工具:

rabbitmqadmin publish exchange=amq.default routing\u key=test payload=“hello,world”
只需使用:

npm安装amqp工具-g
amqp工具--主机rabbitmq.local-u-p-q--导入文件.json

我已经更新了rabbitmqadmin文件以支持文件内容发布。尝试查找包含
EXTRA\u VERBS={
以及
def invoke\u 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'}
}

如果要使用绝对路径提供文件,请从以下行中删除
'populate/'+

with open('populate/' + upload['pfile']) as f: data = f.read()
假设文件rules.json被放置在相对目录“populate”中,那么在不更新open(…)的情况下,下面的命令对我很有效

使用rabbitmqadmin

while read -r line; do 
  echo $line | rabbitmqadmin publish exchange=amq.default routing_key=my_queue ; 
done < messages
读取时-r行;执行
echo$line | rabbitmqadmin publish exchange=amq.default routing_key=my_queue;
完成<消息

未将有效负载参数指定为
rabbitmqadmin publish
意味着它从stdin读取有效负载。

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

这是一条消息的示例,通过类比,您可以编写一个脚本,作为您也可以使用的looseend答案的变体

如果您有一个大文件,这将产生更好的性能

  cat messages | parallel -j 100 \
  ./rabbitmqadmin -H $RABBITMQ_HOST \
                  -u $RABBITMQ_USERNAME \
                  -p $RABBITMQ_PASSWORD  \
                  publish exchange=amq.default \
                  routing_key=myqueue \
                  payload="{}"

这将使用100个作业运行。如果不需要,请忽略主机和凭据。

此代码段如何从文件中发布消息/有效负载?请像这样尝试smth:
读取行时;do rabbitmqadmin publish exchange=amq.default routing_key=test payload=“$line”;done
有效负载=“$line”
会破坏JSON \-转义,比如
{“foo”:“\“嵌套引号\”}
(因为您的shell也解释\-转义)。但是您可以将负载传递给rabbitmqadmin的stdin。是的,正如前面所指出的,
rabbitmqadmin
要求输入为文本(由于来自shell的输入),更不用说它使用http api进行发布/使用,因此对于更大的使用,它的速度往往非常慢。我尝试了获取(节点:24786)MaxListenerSexceedawerning:检测到可能的EventEmitter内存泄漏。添加了11个错误侦听器。使用emitter.setMaxListeners()为了增加limitI也尝试过,但即使提供了路由密钥,routingKey也会出现错误。使用此选项,速度快了5倍:)
while read -r line; do 
  echo $line | rabbitmqadmin publish exchange=amq.default routing_key=my_queue ; 
done < messages
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"}'
  cat messages | parallel -j 100 \
  ./rabbitmqadmin -H $RABBITMQ_HOST \
                  -u $RABBITMQ_USERNAME \
                  -p $RABBITMQ_PASSWORD  \
                  publish exchange=amq.default \
                  routing_key=myqueue \
                  payload="{}"