gmr / rabbitpy

A pure python, thread-safe, minimalistic and pythonic RabbitMQ client library
http://rabbitpy.readthedocs.org
BSD 3-Clause "New" or "Revised" License
242 stars 58 forks source link

Sample code in chapter 2 from book does not send any messages? #122

Closed marcosfromrio closed 3 years ago

marcosfromrio commented 4 years ago

EDIT: sometimes he posts a message, but instead of posting all the messages in the for loop, he posts only once, for the range of number 0, and sometimes number 1.

Look at these images, I run the file 3 times, but I only get two messages.

But when I run the code directly in a Python shell, it looks like everything goes smoothly. Images here.

And i recorded a video running the code in shell python and by executing the file in vscode terminal: https://vimeo.com/412931730

EDIT2: I put some prints, and it seems that the problem is in sending messages, because the entire loop is printed normally, but the amount of messages sent is only one per loop.

Example:

...
message.publish(exchange, 'example-routing-key')
print(f"Loop N: {message_number}")

output:

☁  python3 publisher.py
Loop N: 0
Loop N: 1
Loop N: 2
Loop N: 3
Loop N: 4
Loop N: 5
Loop N: 6
Loop N: 7
Loop N: 8
Loop N: 9
==== publisher.py file!
☁  python3 publisher.py
Loop N: 0
Loop N: 1
Loop N: 2
Loop N: 3
Loop N: 4
Loop N: 5
Loop N: 6
Loop N: 7
Loop N: 8
Loop N: 9
==== publisher.py file!

but i get only two messages:

☁  python3 consumer.py
Message: bytearray(b'Message Number >> 0 <<')
Message: bytearray(b'Message Number >> 1 <<')
==== consumer.py file!

...and after run the publisher file 6 times:

☁  2  python3 consumer.py 

Message: bytearray(b'Message Number >> 0 <<')
Message: bytearray(b'Message Number >> 1 <<')
Message: bytearray(b'Message Number >> 0 <<')
Message: bytearray(b'Message Number >> 1 <<')
Message: bytearray(b'Message Number >> 0 <<')
Message: bytearray(b'Message Number >> 1 <<')
Message: bytearray(b'Message Number >> 2 <<')
Message: bytearray(b'Message Number >> 0 <<')
Message: bytearray(b'Message Number >> 1 <<')
Message: bytearray(b'Message Number >> 2 <<')
Message: bytearray(b'Message Number >> 3 <<')
Message: bytearray(b'Message Number >> 0 <<')
Message: bytearray(b'Message Number >> 1 <<')
Message: bytearray(b'Message Number >> 2 <<')
Message: bytearray(b'Message Number >> 3 <<')
Message: bytearray(b'Message Number >> 4 <<')
Message: bytearray(b'Message Number >> 5 <<')
Message: bytearray(b'Message Number >> 6 <<')
Message: bytearray(b'Message Number >> 7 <<')
Message: bytearray(b'Message Number >> 8 <<')
==== consumer.py file!

I copied and pasted the two python files, but in my rabbitmq admin panel it doesn't display any messages and says the queue is empty. Screenshot: https://imgur.com/a/c51wrBx

python version: Python 3.8.2

service status:

~  sudo systemctl status rabbitmq              
● rabbitmq.service - RabbitMQ broker
Loaded: loaded (/usr/lib/systemd/system/rabbitmq.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2020-04-28 17:32:24 -03; 23min ago
Main PID: 40189 (beam.smp)
Status: "Initialized"
Tasks: 235 (lisudo systemctl status rabbitmq              
● rabbitmq.servmit: 9446)
Memory: 111.7M
CGroup: /system.slice/rabbitmq.service
├─40189 /usr/lib/erlang/erts-10.6.4/bin/beam.smp -W w -A 192 -MBas ageffcbf -MHas ageffcbf -MBlmbcs >
├─40300 /usr/lib/erlang/erts-10.6.4/bin/epmd -daemon
├─40638 erl_child_setup 1024
├─40685 inet_gethost 4
└─40686 inet_gethost 4

pasted codes:

# publisher.py
import rabbitpy

url = 'amqp://guest:guest@localhost:5672/%2F'

connection = rabbitpy.Connection(url)

channel = connection.channel()

exchange = rabbitpy.Exchange(channel, 'chapter2-example')
exchange.declare()

queue = rabbitpy.Queue(channel, 'example')
queue.declare()
queue.bind(exchange, 'example-routing-key')

# Send 10 messages
for message_number in range(0, 10):
    message = rabbitpy.Message(channel,
                               'Test message #%i' % message_number,
                               {'content_type': 'text/plain'},
                               opinionated=True)
    message.publish(exchange, 'example-routing-key')

and:

# consumer.py

import rabbitpy

url = 'amqp://guest:guest@localhost:5672/%2F'

connection = rabbitpy.Connection(url)

channel = connection.channel()

queue = rabbitpy.Queue(channel, 'example')

while len(queue) > 0:
    message = queue.get()
    print('Message:')
    print(' ID: %s' % message.properties['message_id'])
    print(' Time: %s' % message.properties['timestamp'].isoformat())
    print(' Body: %s' % message.body)
    message.ack()
gmr commented 3 years ago

This appears to be a dupe issue.