In this video, that I streamed on Twitch, I demonstrate the code showed here.
I launch the Docker Container and operated it a bit, so you can get to learn few tricks.
I created the RabbitMQ Docker installation based on the official RabbitMQ installation instructions for Ubuntu/Debian:
https://www.rabbitmq.com/install-debian.html#apt-cloudsmith
One interesting aspect is that I cover how the messages are delivered as byte sequence. I show this by sending Unicode characters
Files in the project
Dockerfile
FROM ubuntu:20.04 MAINTAINER Carles Mateo ARG DEBIAN_FRONTEND=noninteractive # This will make sure printing in the Screen when running in dettached mode ENV PYTHONUNBUFFERED=1 ARG PATH_RABBIT_INSTALL=/tmp/rabbit_install/ ARG PATH_RABBIT_APP_PYTHON=/opt/rabbit_python/ RUN mkdir $PATH_RABBIT_INSTALL COPY cloudsmith.sh $PATH_RABBIT_INSTALL RUN chmod +x ${PATH_RABBIT_INSTALL}cloudsmith.sh RUN apt-get update -y && apt install -y sudo python3 python3-pip mc htop less strace zip gzip lynx && apt-get clean RUN ${PATH_RABBIT_INSTALL}cloudsmith.sh RUN service rabbitmq-server start RUN mkdir $PATH_RABBIT_APP_PYTHON COPY requirements.txt $PATH_RABBIT_APP_PYTHON WORKDIR $PATH_RABBIT_APP_PYTHON RUN pwd RUN pip install -r requirements.txt COPY *.py $PATH_RABBIT_APP_PYTHON COPY loop_send_get_messages.sh $PATH_RABBIT_APP_PYTHON RUN chmod +x loop_send_get_messages.sh CMD ./loop_send_get_messages.sh
cloudsmith.sh
#!/usr/bin/sh # From: https://www.rabbitmq.com/install-debian.html#apt-cloudsmith sudo apt-get update -y && apt-get install curl gnupg apt-transport-https -y ## Team RabbitMQ's main signing key curl -1sLf "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/com.rabbitmq.team.gpg > /dev/null ## Cloudsmith: modern Erlang repository curl -1sLf https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/gpg.E495BB49CC4BBE5B.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/io.cloudsmith.rabbitmq.E495BB49CC4BBE5B.gpg > /dev/null ## Cloudsmith: RabbitMQ repository curl -1sLf https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/gpg.9F4587F226208342.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/io.cloudsmith.rabbitmq.9F4587F226208342.gpg > /dev/null ## Add apt repositories maintained by Team RabbitMQ sudo tee /etc/apt/sources.list.d/rabbitmq.list <<EOF ## Provides modern Erlang/OTP releases ## deb [signed-by=/usr/share/keyrings/io.cloudsmith.rabbitmq.E495BB49CC4BBE5B.gpg] https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/deb/ubuntu bionic main deb-src [signed-by=/usr/share/keyrings/io.cloudsmith.rabbitmq.E495BB49CC4BBE5B.gpg] https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/deb/ubuntu bionic main ## Provides RabbitMQ ## deb [signed-by=/usr/share/keyrings/io.cloudsmith.rabbitmq.9F4587F226208342.gpg] https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/deb/ubuntu bionic main deb-src [signed-by=/usr/share/keyrings/io.cloudsmith.rabbitmq.9F4587F226208342.gpg] https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/deb/ubuntu bionic main EOF ## Update package indices sudo apt-get update -y ## Install Erlang packages sudo apt-get install -y erlang-base \ erlang-asn1 erlang-crypto erlang-eldap erlang-ftp erlang-inets \ erlang-mnesia erlang-os-mon erlang-parsetools erlang-public-key \ erlang-runtime-tools erlang-snmp erlang-ssl \ erlang-syntax-tools erlang-tftp erlang-tools erlang-xmerl ## Install rabbitmq-server and its dependencies sudo apt-get install rabbitmq-server -y --fix-missing
build_docker.sh
#!/bin/bash s_DOCKER_IMAGE_NAME="rabbitmq" echo "We will build the Docker Image and name it: ${s_DOCKER_IMAGE_NAME}" echo "After, we will be able to run a Docker Container based on it." printf "Removing old image %s\n" "${s_DOCKER_IMAGE_NAME}" sudo docker rm "${s_DOCKER_IMAGE_NAME}" printf "Creating Docker Image %s\n" "${s_DOCKER_IMAGE_NAME}" sudo docker build -t ${s_DOCKER_IMAGE_NAME} . --no-cache i_EXIT_CODE=$? if [ $i_EXIT_CODE -ne 0 ]; then printf "Error. Exit code %s\n" ${i_EXIT_CODE} exit fi echo "Ready to run ${s_DOCKER_IMAGE_NAME} Docker Container" echo "To run in type: sudo docker run -it --name ${s_DOCKER_IMAGE_NAME} ${s_DOCKER_IMAGE_NAME}" echo "or just use run_in_docker.sh"
requirements.txt
pika
loop_send_get_messages.sh
#!/bin/bash echo "Starting RabbitMQ" service rabbitmq-server start echo "Launching consumer in background which will be listening and executing the callback function" python3 rabbitmq_getfrom.py & while true; do i_MESSAGES=$(( RANDOM % 10 )) echo "Sending $i_MESSAGES messages" for i_MESSAGE in $(seq 1 $i_MESSAGES); do python3 rabbitmq_sendto.py done echo "Sleeping 5 seconds" sleep 5 done echo "Exiting loop"
rabbitmq_sendto.py
#!/usr/bin/env python3 import pika import time connection = pika.BlockingConnection(pika.ConnectionParameters(host="localhost")) channel = connection.channel() channel.queue_declare(queue="hello") s_now = str(time.time()) s_message = "Hello World! " + s_now + " Testing Unicode: çÇ àá😀" channel.basic_publish(exchange="", routing_key="hello", body=s_message) print(" [x] Sent '" + s_message + "'") connection.close()
rabbitmq_getfrom.py
#!/usr/bin/env python3 import pika def callback(ch, method, properties, body): # print(f" [x] Received in channel: {ch} method: {method} properties: {properties} body: {body}") print(f" [x] Received body: {body}") connection = pika.BlockingConnection(pika.ConnectionParameters(host="localhost")) channel = connection.channel() channel.queue_declare(queue="hello") print(" [*] Waiting for messages. To exit press Ctrl+C") # This will loop channel.basic_consume(queue="hello", on_message_callback=callback) channel.start_consuming() print("Finishing consumer")