2015-11-02 65 views
5

Publikowanie pojedynczych wiadomości w kolejce RabbitMQ można łatwo zrobić za pomocą interfejsu użytkownika, umieszczając wiadomość w interfejsie i klikając przycisk "Publikuj wiadomość".Publikowanie wielu wiadomości do RabbitMQ z pliku

W jaki sposób publikuje się partię wiadomości?

Mam plik z wiadomościami, które należy wysłać do RabbitMQ. Każda linia ma jedną wiadomość.

Jak mogę opublikować wszystkie wiadomości z pliku na mój serwer RabbitMQ?

Czy można to zrobić z wiersza poleceń?

Odpowiedz

2

Trzeba użyć narzędzia rabbitmqadmin cli:

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

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

+1

Jak ten fragment publikować wiadomości/ładunki z pliku? – summerbulb

+0

Spróbuj coś takiego: 'while read line; do knockmqadmin publish exchange = amq.default routing_key = test payload = "$ line"; done aeryaguzov

+1

'payload =" $ line "' złamie JSON \ -kwiaty takie jak '{" foo ":" \ "zagnieżdżone cudzysłowy \" "}' (ponieważ ty też interpretujesz \ -skoki). Ale możesz przekazać ładunek do stdin rabbitmqadmin. –

0

Wystarczy użyć amqp-tool:

npm install amqp-tool -g 

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

mam zaktualizowany plik rabbitmqadmin wspierania publikowania zawartości plików. Spróbuj znaleźć wiersz zawierający EXTRA_VERBS = { jak również def invoke_publish(self): i aktualizować swoją powiązany kod następująco

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'} 
} 

i

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") 

Usuń 'populate/' + z poniższej linii, jeśli chcesz, aby dostarczyć plik za pomocą ścieżki bezwzględnej.

with open('populate/' + upload['pfile']) as f: data = f.read() 

Bez aktualizacjach otwarty (...) następujące polecenie pracował dla mnie w porządku, przy założeniu, że plik rules.json został umieszczony w katalogu względnego "zapełnić"

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

Korzystanie rabbitmqadmin

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

Brak określenia parametru ładunku na rabbitmqadmin publish oznacza, że ​​odczytuje ładunek ze standardowego wejścia.

0

Zrobiłem coś, żeby sobie z tym poradzić (a także by zużywać wiadomości od rmq). Możesz pobrać plik binarny z releases page on github. Ma obsługę TLS i kilka innych ciekawych funkcji unixowych (ENV var obsługuje użytkownika/hasło, niestandardowe ograniczniki wejścia/wyjścia).

https://github.com/joekarl/rmq-cli