├── .gitignore ├── 1-First-RabbitMQ-App ├── consumer.py └── producer.py ├── 2-Competing-Consumers ├── consumer.py └── producer.py ├── 3-Pub-Sub ├── firstconsumer.py ├── producer.py └── secondconsumer.py ├── 4-Routing ├── analyticsconsumer.py ├── paymentsconsumer.py └── producer.py ├── 5-Topics ├── analyticsconsumer.py ├── paymentsconsumer.py ├── producer.py └── userconsumer.py ├── 6-Request-Reply ├── client.py └── server.py ├── 7-Other-Exchanges ├── Consistant-Hashing-Exchange │ ├── SetUp.md │ ├── consumer.py │ └── producer.py ├── Exchange-Exchange │ ├── consumer.py │ └── producer.py └── Headers-Exchange │ ├── consumer.py │ └── producer.py ├── 8-Exchange-Options ├── Accept-Reject-Messages │ ├── consumer.py │ └── producer.py ├── Alternate-Exchange │ ├── consumer.py │ └── producer.py └── DeadLetter-Exchange │ ├── consumer.py │ └── producer.py ├── README.md └── environment ├── Scripts ├── Activate.ps1 ├── activate ├── activate.bat ├── deactivate.bat ├── pip.exe ├── pip3.9.exe ├── pip3.exe ├── python.exe └── pythonw.exe └── pyvenv.cfg /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /1-First-RabbitMQ-App/consumer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | 3 | def on_message_received(ch, method, properties, body): 4 | print(f"received new message: {body}") 5 | 6 | connection_parameters = pika.ConnectionParameters('localhost') 7 | 8 | connection = pika.BlockingConnection(connection_parameters) 9 | 10 | channel = connection.channel() 11 | 12 | channel.queue_declare(queue='letterbox') 13 | 14 | channel.basic_consume(queue='letterbox', auto_ack=True, 15 | on_message_callback=on_message_received) 16 | 17 | print("Starting Consuming") 18 | 19 | channel.start_consuming() -------------------------------------------------------------------------------- /1-First-RabbitMQ-App/producer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | 3 | connection_parameters = pika.ConnectionParameters('localhost') 4 | 5 | connection = pika.BlockingConnection(connection_parameters) 6 | 7 | channel = connection.channel() 8 | 9 | channel.queue_declare(queue='letterbox') 10 | 11 | message = "Hello this is my first message" 12 | 13 | channel.basic_publish(exchange='', routing_key='letterbox', body=message) 14 | 15 | print(f"sent message: {message}") 16 | 17 | connection.close() -------------------------------------------------------------------------------- /2-Competing-Consumers/consumer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | import time 3 | import random 4 | 5 | def on_message_received(ch, method, properties, body): 6 | processing_time = random.randint(1, 6) 7 | print(f'received: "{body}", will take {processing_time} to process') 8 | time.sleep(processing_time) 9 | ch.basic_ack(delivery_tag=method.delivery_tag) 10 | print(f'finished processing and acknowledged message') 11 | 12 | connection_parameters = pika.ConnectionParameters('localhost') 13 | 14 | connection = pika.BlockingConnection(connection_parameters) 15 | 16 | channel = connection.channel() 17 | 18 | channel.queue_declare(queue='letterbox') 19 | 20 | channel.basic_qos(prefetch_count=1) 21 | 22 | channel.basic_consume(queue='letterbox', on_message_callback=on_message_received) 23 | 24 | print('Starting Consuming') 25 | 26 | channel.start_consuming() -------------------------------------------------------------------------------- /2-Competing-Consumers/producer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | import time 3 | import random 4 | 5 | connection_parameters = pika.ConnectionParameters('localhost') 6 | 7 | connection = pika.BlockingConnection(connection_parameters) 8 | 9 | channel = connection.channel() 10 | 11 | channel.queue_declare(queue='letterbox') 12 | 13 | messageId = 1 14 | 15 | while(True): 16 | message = f"Sending Message Id: {messageId}" 17 | 18 | channel.basic_publish(exchange='', routing_key='letterbox', body=message) 19 | 20 | print(f"sent message: {message}") 21 | 22 | time.sleep(random.randint(1, 4)) 23 | 24 | messageId+=1 25 | -------------------------------------------------------------------------------- /3-Pub-Sub/firstconsumer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | 3 | def on_message_received(ch, method, properties, body): 4 | print(f"firstconsumer - received new message: {body}") 5 | 6 | connection_parameters = pika.ConnectionParameters('localhost') 7 | 8 | connection = pika.BlockingConnection(connection_parameters) 9 | 10 | channel = connection.channel() 11 | 12 | channel.exchange_declare(exchange='pubsub', exchange_type='fanout') 13 | 14 | queue = channel.queue_declare(queue='', exclusive=True) 15 | 16 | channel.queue_bind(exchange='pubsub', queue=queue.method.queue) 17 | 18 | channel.basic_consume(queue=queue.method.queue, auto_ack=True, 19 | on_message_callback=on_message_received) 20 | 21 | print("Starting Consuming") 22 | 23 | channel.start_consuming() -------------------------------------------------------------------------------- /3-Pub-Sub/producer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | from pika.exchange_type import ExchangeType 3 | 4 | connection_parameters = pika.ConnectionParameters('localhost') 5 | 6 | connection = pika.BlockingConnection(connection_parameters) 7 | 8 | channel = connection.channel() 9 | 10 | channel.exchange_declare(exchange='pubsub', exchange_type=ExchangeType.fanout) 11 | 12 | message = "Hello I want to broadcast this message" 13 | 14 | channel.basic_publish(exchange='pubsub', routing_key='', body=message) 15 | 16 | print(f"sent message: {message}") 17 | 18 | connection.close() -------------------------------------------------------------------------------- /3-Pub-Sub/secondconsumer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | 3 | def on_message_received(ch, method, properties, body): 4 | print(f"secondconsumer - received new message: {body}") 5 | 6 | connection_parameters = pika.ConnectionParameters('localhost') 7 | 8 | connection = pika.BlockingConnection(connection_parameters) 9 | 10 | channel = connection.channel() 11 | 12 | channel.exchange_declare(exchange='pubsub', exchange_type='fanout') 13 | 14 | queue = channel.queue_declare(queue='', exclusive=True) 15 | 16 | channel.queue_bind(exchange='pubsub', queue=queue.method.queue) 17 | 18 | channel.basic_consume(queue=queue.method.queue, auto_ack=True, 19 | on_message_callback=on_message_received) 20 | 21 | print("Starting Consuming") 22 | 23 | channel.start_consuming() -------------------------------------------------------------------------------- /4-Routing/analyticsconsumer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | from pika.exchange_type import ExchangeType 3 | 4 | def on_message_received(ch, method, properties, body): 5 | print(f'Analytics - received new message: {body}') 6 | 7 | connection_parameters = pika.ConnectionParameters('localhost') 8 | 9 | connection = pika.BlockingConnection(connection_parameters) 10 | 11 | channel = connection.channel() 12 | 13 | channel.exchange_declare(exchange='routing', exchange_type=ExchangeType.direct) 14 | 15 | queue = channel.queue_declare(queue='', exclusive=True) 16 | 17 | channel.queue_bind(exchange='routing', queue=queue.method.queue, routing_key='analyticsonly') 18 | channel.queue_bind(exchange='routing', queue=queue.method.queue, routing_key='both') 19 | 20 | channel.basic_consume(queue=queue.method.queue, auto_ack=True, 21 | on_message_callback=on_message_received) 22 | 23 | print('Analytics Starting Consuming') 24 | 25 | channel.start_consuming() -------------------------------------------------------------------------------- /4-Routing/paymentsconsumer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | from pika.exchange_type import ExchangeType 3 | 4 | def on_message_received(ch, method, properties, body): 5 | print(f'Payments - received new message: {body}') 6 | 7 | connection_parameters = pika.ConnectionParameters('localhost') 8 | 9 | connection = pika.BlockingConnection(connection_parameters) 10 | 11 | channel = connection.channel() 12 | 13 | channel.exchange_declare(exchange='routing', exchange_type=ExchangeType.direct) 14 | 15 | queue = channel.queue_declare(queue='', exclusive=True) 16 | 17 | channel.queue_bind(exchange='routing', queue=queue.method.queue, routing_key='paymentsonly') 18 | channel.queue_bind(exchange='routing', queue=queue.method.queue, routing_key='both') 19 | channel.basic_consume(queue=queue.method.queue, auto_ack=True, 20 | on_message_callback=on_message_received) 21 | 22 | print('Payments Starting Consuming') 23 | 24 | channel.start_consuming() -------------------------------------------------------------------------------- /4-Routing/producer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | from pika.exchange_type import ExchangeType 3 | 4 | connection_parameters = pika.ConnectionParameters('localhost') 5 | 6 | connection = pika.BlockingConnection(connection_parameters) 7 | 8 | channel = connection.channel() 9 | 10 | channel.exchange_declare(exchange='routing', exchange_type=ExchangeType.direct) 11 | 12 | message = 'This message needs to be routed' 13 | 14 | channel.basic_publish(exchange='routing', routing_key='both', body=message) 15 | 16 | print(f'sent message: {message}') 17 | 18 | connection.close() -------------------------------------------------------------------------------- /5-Topics/analyticsconsumer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | from pika.exchange_type import ExchangeType 3 | 4 | def on_message_received(ch, method, properties, body): 5 | print(f'Analytics - received new message: {body}') 6 | 7 | connection_parameters = pika.ConnectionParameters('localhost') 8 | 9 | connection = pika.BlockingConnection(connection_parameters) 10 | 11 | channel = connection.channel() 12 | 13 | channel.exchange_declare(exchange='topic', exchange_type=ExchangeType.topic) 14 | 15 | queue = channel.queue_declare(queue='', exclusive=True) 16 | 17 | channel.queue_bind(exchange='topic', queue=queue.method.queue, routing_key='*.europe.*') 18 | 19 | channel.basic_consume(queue=queue.method.queue, auto_ack=True, 20 | on_message_callback=on_message_received) 21 | 22 | print('Analytics Starting Consuming') 23 | 24 | channel.start_consuming() -------------------------------------------------------------------------------- /5-Topics/paymentsconsumer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | from pika.exchange_type import ExchangeType 3 | 4 | def on_message_received(ch, method, properties, body): 5 | print(f'Payments - received new message: {body}') 6 | 7 | connection_parameters = pika.ConnectionParameters('localhost') 8 | 9 | connection = pika.BlockingConnection(connection_parameters) 10 | 11 | channel = connection.channel() 12 | 13 | channel.exchange_declare(exchange='topic', exchange_type=ExchangeType.topic) 14 | 15 | queue = channel.queue_declare(queue='', exclusive=True) 16 | 17 | channel.queue_bind(exchange='topic', queue=queue.method.queue, routing_key='#.payments') 18 | 19 | channel.basic_consume(queue=queue.method.queue, auto_ack=True, 20 | on_message_callback=on_message_received) 21 | 22 | print('Payments Starting Consuming') 23 | 24 | channel.start_consuming() -------------------------------------------------------------------------------- /5-Topics/producer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | from pika.exchange_type import ExchangeType 3 | 4 | connection_parameters = pika.ConnectionParameters('localhost') 5 | 6 | connection = pika.BlockingConnection(connection_parameters) 7 | 8 | channel = connection.channel() 9 | 10 | channel.exchange_declare(exchange='topic', exchange_type=ExchangeType.topic) 11 | 12 | user_payments_message = 'A european user paid for something' 13 | 14 | channel.basic_publish(exchange='topic', routing_key='user.europe.payments', body=user_payments_message) 15 | 16 | print(f'sent message: {user_payments_message}') 17 | 18 | business_order_message = 'A european business ordered goods' 19 | 20 | channel.basic_publish(exchange='topic', routing_key='business.europe.order', body=business_order_message) 21 | 22 | print(f'sent message: {business_order_message}') 23 | 24 | connection.close() -------------------------------------------------------------------------------- /5-Topics/userconsumer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | from pika.exchange_type import ExchangeType 3 | 4 | def on_message_received(ch, method, properties, body): 5 | print(f'User - received new message: {body}') 6 | 7 | connection_parameters = pika.ConnectionParameters('localhost') 8 | 9 | connection = pika.BlockingConnection(connection_parameters) 10 | 11 | channel = connection.channel() 12 | 13 | channel.exchange_declare(exchange='topic', exchange_type=ExchangeType.topic) 14 | 15 | queue = channel.queue_declare(queue='', exclusive=True) 16 | 17 | channel.queue_bind(exchange='topic', queue=queue.method.queue, routing_key='user.#') 18 | 19 | channel.basic_consume(queue=queue.method.queue, auto_ack=True, 20 | on_message_callback=on_message_received) 21 | 22 | print('User Starting Consuming') 23 | 24 | channel.start_consuming() -------------------------------------------------------------------------------- /6-Request-Reply/client.py: -------------------------------------------------------------------------------- 1 | import pika 2 | import uuid 3 | 4 | def on_reply_message_received(ch, method, properties, body): 5 | print(f"reply recieved: {body}") 6 | 7 | connection_parameters = pika.ConnectionParameters('localhost') 8 | 9 | connection = pika.BlockingConnection(connection_parameters) 10 | 11 | channel = connection.channel() 12 | 13 | reply_queue = channel.queue_declare(queue='', exclusive=True) 14 | 15 | channel.basic_consume(queue=reply_queue.method.queue, auto_ack=True, 16 | on_message_callback=on_reply_message_received) 17 | 18 | channel.queue_declare(queue='request-queue') 19 | 20 | cor_id = str(uuid.uuid4()) 21 | print(f"Sending Request: {cor_id}") 22 | 23 | channel.basic_publish('', routing_key='request-queue', properties=pika.BasicProperties( 24 | reply_to=reply_queue.method.queue, 25 | correlation_id=cor_id 26 | ), body='Can I request a reply?') 27 | 28 | print("Starting Client") 29 | 30 | channel.start_consuming() -------------------------------------------------------------------------------- /6-Request-Reply/server.py: -------------------------------------------------------------------------------- 1 | import pika 2 | 3 | def on_request_message_received(ch, method, properties, body): 4 | print(f"Received Request: {properties.correlation_id}") 5 | ch.basic_publish('', routing_key=properties.reply_to, body=f'Hey its your reply to {properties.correlation_id}') 6 | 7 | connection_parameters = pika.ConnectionParameters('localhost') 8 | 9 | connection = pika.BlockingConnection(connection_parameters) 10 | 11 | channel = connection.channel() 12 | 13 | channel.queue_declare(queue='request-queue') 14 | 15 | channel.basic_consume(queue='request-queue', auto_ack=True, 16 | on_message_callback=on_request_message_received) 17 | 18 | print("Starting Server") 19 | 20 | channel.start_consuming() -------------------------------------------------------------------------------- /7-Other-Exchanges/Consistant-Hashing-Exchange/SetUp.md: -------------------------------------------------------------------------------- 1 | ## cd C:\Program Files\RabbitMQ Server\rabbitmq_server-3.9.8\escript> 2 | 3 | ## rabbitmq-plugins enable rabbitmq_consistent_hash_exchange 4 | -------------------------------------------------------------------------------- /7-Other-Exchanges/Consistant-Hashing-Exchange/consumer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | 3 | def queue_1_on_message_received(ch, method, properties, body): 4 | print(f'queue 1 received new message: {body}') 5 | 6 | def queue_2_on_message_received(ch, method, properties, body): 7 | print(f'queue 2 received new message: {body}') 8 | 9 | connection_parameters = pika.ConnectionParameters('localhost') 10 | 11 | connection = pika.BlockingConnection(connection_parameters) 12 | 13 | channel = connection.channel() 14 | 15 | channel.exchange_declare('samplehashing', 'x-consistent-hash') 16 | 17 | channel.queue_declare(queue='letterbox1') 18 | channel.queue_declare(queue='letterbox2') 19 | 20 | channel.queue_bind('letterbox1', 'samplehashing', routing_key='1') 21 | channel.basic_consume(queue='letterbox1', auto_ack=True, 22 | on_message_callback=queue_1_on_message_received) 23 | 24 | channel.queue_bind('letterbox2', 'samplehashing', routing_key='1') 25 | channel.basic_consume(queue='letterbox2', auto_ack=True, 26 | on_message_callback=queue_2_on_message_received) 27 | 28 | print('Starting Consuming') 29 | 30 | channel.start_consuming() -------------------------------------------------------------------------------- /7-Other-Exchanges/Consistant-Hashing-Exchange/producer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | 3 | connection_parameters = pika.ConnectionParameters('localhost') 4 | 5 | connection = pika.BlockingConnection(connection_parameters) 6 | 7 | channel = connection.channel() 8 | 9 | channel.exchange_declare('samplehashing', 'x-consistent-hash') 10 | 11 | message = 'Hello hash the routing key and pass me on please!' 12 | 13 | routing_key_to_hash = 'hash me!' 14 | 15 | channel.basic_publish(exchange='samplehashing', routing_key=routing_key_to_hash, body=message) 16 | 17 | print(f'sent message: {message}') 18 | 19 | connection.close() -------------------------------------------------------------------------------- /7-Other-Exchanges/Exchange-Exchange/consumer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | def on_message_received(ch, method, properties, body): 3 | print(f'received new message: {body}') 4 | 5 | connection_parameters = pika.ConnectionParameters('localhost') 6 | 7 | connection = pika.BlockingConnection(connection_parameters) 8 | 9 | channel = connection.channel() 10 | 11 | channel.exchange_declare(exchange='secondexchange', exchange_type='fanout') 12 | 13 | channel.queue_declare(queue='letterbox') 14 | 15 | channel.queue_bind('letterbox', 'secondexchange') 16 | 17 | channel.basic_consume(queue='letterbox', auto_ack=True, 18 | on_message_callback=on_message_received) 19 | 20 | print('Starting Consuming') 21 | 22 | channel.start_consuming() -------------------------------------------------------------------------------- /7-Other-Exchanges/Exchange-Exchange/producer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | 3 | connection_parameters = pika.ConnectionParameters('localhost') 4 | 5 | connection = pika.BlockingConnection(connection_parameters) 6 | 7 | channel = connection.channel() 8 | 9 | channel.exchange_declare(exchange='firstexchange', exchange_type='direct') 10 | 11 | channel.exchange_declare(exchange='secondexchange', exchange_type='fanout') 12 | 13 | channel.exchange_bind('secondexchange', 'firstexchange') 14 | 15 | message = "This message has gone through multiple exchanges" 16 | 17 | channel.basic_publish(exchange='firstexchange', routing_key='', body=message) 18 | 19 | print(f"sent message: {message}") 20 | 21 | connection.close() -------------------------------------------------------------------------------- /7-Other-Exchanges/Headers-Exchange/consumer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | from pika.exchange_type import ExchangeType 3 | 4 | def on_message_received(ch, method, properties, body): 5 | print(f'received new message: {body}') 6 | 7 | connection_parameters = pika.ConnectionParameters('localhost') 8 | 9 | connection = pika.BlockingConnection(connection_parameters) 10 | 11 | channel = connection.channel() 12 | 13 | channel.exchange_declare('headersexchange', ExchangeType.headers) 14 | 15 | channel.queue_declare('letterbox') 16 | 17 | bind_args = { 18 | 'x-match': 'any', 19 | 'name': 'brian', 20 | 'age': '21' 21 | } 22 | 23 | channel.queue_bind('letterbox', 'headersexchange', arguments=bind_args) 24 | 25 | channel.basic_consume(queue='letterbox', auto_ack=True, 26 | on_message_callback=on_message_received) 27 | 28 | print('Starting Consuming') 29 | 30 | channel.start_consuming() -------------------------------------------------------------------------------- /7-Other-Exchanges/Headers-Exchange/producer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | from pika.exchange_type import ExchangeType 3 | 4 | connection_parameters = pika.ConnectionParameters('localhost') 5 | 6 | connection = pika.BlockingConnection(connection_parameters) 7 | 8 | channel = connection.channel() 9 | 10 | channel.exchange_declare('headersexchange', ExchangeType.headers) 11 | 12 | message = 'This message will be sent with headers' 13 | 14 | channel.basic_publish( 15 | exchange='headersexchange', 16 | routing_key='', 17 | body=message, 18 | properties=pika.BasicProperties(headers={'name': 'brian'})) 19 | 20 | print(f'sent message: {message}') 21 | 22 | connection.close() -------------------------------------------------------------------------------- /8-Exchange-Options/Accept-Reject-Messages/consumer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | from pika.exchange_type import ExchangeType 3 | 4 | def on_message_received(ch, method, properties, body): 5 | 6 | if (method.delivery_tag % 5 == 0): 7 | #ch.basic_ack(delivery_tag=method.delivery_tag, multiple=True) 8 | ch.basic_nack(delivery_tag=method.delivery_tag, requeue=False, multiple=True) 9 | 10 | #ch.basic_reject(delivery_tag=method.delivery_tag, requeue=False) 11 | 12 | print(f'Received new message: {method.delivery_tag}') 13 | 14 | connection_parameters = pika.ConnectionParameters('localhost') 15 | 16 | connection = pika.BlockingConnection(connection_parameters) 17 | 18 | channel = connection.channel() 19 | 20 | channel.exchange_declare( 21 | exchange='acceptrejectexchange', 22 | exchange_type=ExchangeType.fanout) 23 | 24 | channel.queue_declare(queue='letterbox') 25 | channel.queue_bind('letterbox', 'acceptrejectexchange') 26 | 27 | channel.basic_consume(queue='letterbox', on_message_callback=on_message_received) 28 | 29 | print('Starting Consuming') 30 | 31 | channel.start_consuming() -------------------------------------------------------------------------------- /8-Exchange-Options/Accept-Reject-Messages/producer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | from pika.exchange_type import ExchangeType 3 | 4 | connection_parameters = pika.ConnectionParameters('localhost') 5 | 6 | connection = pika.BlockingConnection(connection_parameters) 7 | 8 | channel = connection.channel() 9 | 10 | channel.exchange_declare( 11 | exchange='acceptrejectexchange', 12 | exchange_type=ExchangeType.fanout) 13 | 14 | message = 'Lets send this' 15 | 16 | while True: 17 | channel.basic_publish(exchange='acceptrejectexchange', routing_key='samplekey', body=message) 18 | print(f'sent message: {message}') 19 | input('Press any key to continue') 20 | 21 | -------------------------------------------------------------------------------- /8-Exchange-Options/Alternate-Exchange/consumer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | from pika.exchange_type import ExchangeType 3 | 4 | def alt_queue_on_message_received(ch, method, properties, body): 5 | print(f'Alt - received new message: {body}') 6 | 7 | def main_queue_on_message_received(ch, method, properties, body): 8 | print(f'Main - received new message: {body}') 9 | 10 | connection_parameters = pika.ConnectionParameters('localhost') 11 | 12 | connection = pika.BlockingConnection(connection_parameters) 13 | 14 | channel = connection.channel() 15 | 16 | channel.exchange_declare( 17 | exchange='altexchange', 18 | exchange_type=ExchangeType.fanout) 19 | 20 | channel.exchange_declare( 21 | exchange='mainexchange', 22 | exchange_type=ExchangeType.direct, 23 | arguments={'alternate-exchange': 'altexchange'}) 24 | 25 | channel.queue_declare(queue='altexchangequeue') 26 | channel.queue_bind('altexchangequeue', 'altexchange') 27 | 28 | channel.basic_consume(queue='altexchangequeue', on_message_callback=alt_queue_on_message_received) 29 | 30 | channel.queue_declare(queue='mainexchangequeue') 31 | channel.queue_bind('mainexchangequeue', 'mainexchange', 'test') 32 | 33 | channel.basic_consume(queue='mainexchangequeue', on_message_callback=main_queue_on_message_received) 34 | 35 | print('Starting Consuming') 36 | 37 | channel.start_consuming() -------------------------------------------------------------------------------- /8-Exchange-Options/Alternate-Exchange/producer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | from pika.exchange_type import ExchangeType 3 | 4 | connection_parameters = pika.ConnectionParameters('localhost') 5 | 6 | connection = pika.BlockingConnection(connection_parameters) 7 | 8 | channel = connection.channel() 9 | 10 | channel.exchange_declare(exchange='altexchange', exchange_type=ExchangeType.fanout) 11 | 12 | channel.exchange_declare(exchange='mainexchange', exchange_type=ExchangeType.direct, arguments={'alternate-exchange': 'altexchange'}) 13 | 14 | message = 'Hello this is my first message' 15 | 16 | channel.basic_publish(exchange='mainexchange', routing_key='test', body=message) 17 | 18 | print(f'sent message: {message}') 19 | 20 | connection.close() -------------------------------------------------------------------------------- /8-Exchange-Options/DeadLetter-Exchange/consumer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | from pika.exchange_type import ExchangeType 3 | 4 | def deadletter_queue_on_message_received(ch, method, properties, body): 5 | print(f'Dead letter - received new message: {body}') 6 | ch.basic_ack(method.delivery_tag) 7 | 8 | def main_queue_on_message_received(ch, method, properties, body): 9 | print(f'Main - received new message: {body}') 10 | 11 | connection_parameters = pika.ConnectionParameters('localhost') 12 | 13 | connection = pika.BlockingConnection(connection_parameters) 14 | 15 | channel = connection.channel() 16 | 17 | channel.exchange_declare( 18 | exchange='mainexchange', 19 | exchange_type=ExchangeType.direct) 20 | 21 | channel.exchange_declare( 22 | exchange='dlx', 23 | exchange_type=ExchangeType.fanout 24 | ) 25 | 26 | channel.queue_declare( 27 | queue='mainexchangequeue', 28 | arguments={'x-dead-letter-exchange': 'dlx', 'x-message-ttl' : 1000}) 29 | channel.queue_bind('mainexchangequeue', 'mainexchange', 'test') 30 | 31 | channel.queue_declare('deadletterqueue') 32 | channel.queue_bind('deadletterqueue', 'dlx') 33 | channel.basic_consume(queue='deadletterqueue', on_message_callback=deadletter_queue_on_message_received) 34 | 35 | print('Starting Consuming') 36 | 37 | channel.start_consuming() -------------------------------------------------------------------------------- /8-Exchange-Options/DeadLetter-Exchange/producer.py: -------------------------------------------------------------------------------- 1 | import pika 2 | from pika.exchange_type import ExchangeType 3 | from pika.spec import BasicProperties 4 | 5 | connection_parameters = pika.ConnectionParameters('localhost') 6 | 7 | connection = pika.BlockingConnection(connection_parameters) 8 | 9 | channel = connection.channel() 10 | 11 | channel.exchange_declare(exchange='mainexchange', exchange_type=ExchangeType.direct) 12 | 13 | message = 'This message might expire' 14 | 15 | channel.basic_publish( 16 | exchange='mainexchange', 17 | routing_key='test', 18 | body=message) 19 | 20 | print(f'sent message: {message}') 21 | 22 | connection.close() -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # jumpstartCS-rabbitmq-python 2 | Accompanying code for the jumpstartCS tutorial series on RabbitMQ 3 | -------------------------------------------------------------------------------- /environment/Scripts/Activate.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | .Synopsis 3 | Activate a Python virtual environment for the current PowerShell session. 4 | 5 | .Description 6 | Pushes the python executable for a virtual environment to the front of the 7 | $Env:PATH environment variable and sets the prompt to signify that you are 8 | in a Python virtual environment. Makes use of the command line switches as 9 | well as the `pyvenv.cfg` file values present in the virtual environment. 10 | 11 | .Parameter VenvDir 12 | Path to the directory that contains the virtual environment to activate. The 13 | default value for this is the parent of the directory that the Activate.ps1 14 | script is located within. 15 | 16 | .Parameter Prompt 17 | The prompt prefix to display when this virtual environment is activated. By 18 | default, this prompt is the name of the virtual environment folder (VenvDir) 19 | surrounded by parentheses and followed by a single space (ie. '(.venv) '). 20 | 21 | .Example 22 | Activate.ps1 23 | Activates the Python virtual environment that contains the Activate.ps1 script. 24 | 25 | .Example 26 | Activate.ps1 -Verbose 27 | Activates the Python virtual environment that contains the Activate.ps1 script, 28 | and shows extra information about the activation as it executes. 29 | 30 | .Example 31 | Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv 32 | Activates the Python virtual environment located in the specified location. 33 | 34 | .Example 35 | Activate.ps1 -Prompt "MyPython" 36 | Activates the Python virtual environment that contains the Activate.ps1 script, 37 | and prefixes the current prompt with the specified string (surrounded in 38 | parentheses) while the virtual environment is active. 39 | 40 | .Notes 41 | On Windows, it may be required to enable this Activate.ps1 script by setting the 42 | execution policy for the user. You can do this by issuing the following PowerShell 43 | command: 44 | 45 | PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser 46 | 47 | For more information on Execution Policies: 48 | https://go.microsoft.com/fwlink/?LinkID=135170 49 | 50 | #> 51 | Param( 52 | [Parameter(Mandatory = $false)] 53 | [String] 54 | $VenvDir, 55 | [Parameter(Mandatory = $false)] 56 | [String] 57 | $Prompt 58 | ) 59 | 60 | <# Function declarations --------------------------------------------------- #> 61 | 62 | <# 63 | .Synopsis 64 | Remove all shell session elements added by the Activate script, including the 65 | addition of the virtual environment's Python executable from the beginning of 66 | the PATH variable. 67 | 68 | .Parameter NonDestructive 69 | If present, do not remove this function from the global namespace for the 70 | session. 71 | 72 | #> 73 | function global:deactivate ([switch]$NonDestructive) { 74 | # Revert to original values 75 | 76 | # The prior prompt: 77 | if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { 78 | Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt 79 | Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT 80 | } 81 | 82 | # The prior PYTHONHOME: 83 | if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { 84 | Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME 85 | Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME 86 | } 87 | 88 | # The prior PATH: 89 | if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { 90 | Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH 91 | Remove-Item -Path Env:_OLD_VIRTUAL_PATH 92 | } 93 | 94 | # Just remove the VIRTUAL_ENV altogether: 95 | if (Test-Path -Path Env:VIRTUAL_ENV) { 96 | Remove-Item -Path env:VIRTUAL_ENV 97 | } 98 | 99 | # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: 100 | if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { 101 | Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force 102 | } 103 | 104 | # Leave deactivate function in the global namespace if requested: 105 | if (-not $NonDestructive) { 106 | Remove-Item -Path function:deactivate 107 | } 108 | } 109 | 110 | <# 111 | .Description 112 | Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the 113 | given folder, and returns them in a map. 114 | 115 | For each line in the pyvenv.cfg file, if that line can be parsed into exactly 116 | two strings separated by `=` (with any amount of whitespace surrounding the =) 117 | then it is considered a `key = value` line. The left hand string is the key, 118 | the right hand is the value. 119 | 120 | If the value starts with a `'` or a `"` then the first and last character is 121 | stripped from the value before being captured. 122 | 123 | .Parameter ConfigDir 124 | Path to the directory that contains the `pyvenv.cfg` file. 125 | #> 126 | function Get-PyVenvConfig( 127 | [String] 128 | $ConfigDir 129 | ) { 130 | Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" 131 | 132 | # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). 133 | $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue 134 | 135 | # An empty map will be returned if no config file is found. 136 | $pyvenvConfig = @{ } 137 | 138 | if ($pyvenvConfigPath) { 139 | 140 | Write-Verbose "File exists, parse `key = value` lines" 141 | $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath 142 | 143 | $pyvenvConfigContent | ForEach-Object { 144 | $keyval = $PSItem -split "\s*=\s*", 2 145 | if ($keyval[0] -and $keyval[1]) { 146 | $val = $keyval[1] 147 | 148 | # Remove extraneous quotations around a string value. 149 | if ("'""".Contains($val.Substring(0, 1))) { 150 | $val = $val.Substring(1, $val.Length - 2) 151 | } 152 | 153 | $pyvenvConfig[$keyval[0]] = $val 154 | Write-Verbose "Adding Key: '$($keyval[0])'='$val'" 155 | } 156 | } 157 | } 158 | return $pyvenvConfig 159 | } 160 | 161 | 162 | <# Begin Activate script --------------------------------------------------- #> 163 | 164 | # Determine the containing directory of this script 165 | $VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition 166 | $VenvExecDir = Get-Item -Path $VenvExecPath 167 | 168 | Write-Verbose "Activation script is located in path: '$VenvExecPath'" 169 | Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" 170 | Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" 171 | 172 | # Set values required in priority: CmdLine, ConfigFile, Default 173 | # First, get the location of the virtual environment, it might not be 174 | # VenvExecDir if specified on the command line. 175 | if ($VenvDir) { 176 | Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" 177 | } 178 | else { 179 | Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." 180 | $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") 181 | Write-Verbose "VenvDir=$VenvDir" 182 | } 183 | 184 | # Next, read the `pyvenv.cfg` file to determine any required value such 185 | # as `prompt`. 186 | $pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir 187 | 188 | # Next, set the prompt from the command line, or the config file, or 189 | # just use the name of the virtual environment folder. 190 | if ($Prompt) { 191 | Write-Verbose "Prompt specified as argument, using '$Prompt'" 192 | } 193 | else { 194 | Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" 195 | if ($pyvenvCfg -and $pyvenvCfg['prompt']) { 196 | Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" 197 | $Prompt = $pyvenvCfg['prompt']; 198 | } 199 | else { 200 | Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virutal environment)" 201 | Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" 202 | $Prompt = Split-Path -Path $venvDir -Leaf 203 | } 204 | } 205 | 206 | Write-Verbose "Prompt = '$Prompt'" 207 | Write-Verbose "VenvDir='$VenvDir'" 208 | 209 | # Deactivate any currently active virtual environment, but leave the 210 | # deactivate function in place. 211 | deactivate -nondestructive 212 | 213 | # Now set the environment variable VIRTUAL_ENV, used by many tools to determine 214 | # that there is an activated venv. 215 | $env:VIRTUAL_ENV = $VenvDir 216 | 217 | if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { 218 | 219 | Write-Verbose "Setting prompt to '$Prompt'" 220 | 221 | # Set the prompt to include the env name 222 | # Make sure _OLD_VIRTUAL_PROMPT is global 223 | function global:_OLD_VIRTUAL_PROMPT { "" } 224 | Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT 225 | New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt 226 | 227 | function global:prompt { 228 | Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " 229 | _OLD_VIRTUAL_PROMPT 230 | } 231 | } 232 | 233 | # Clear PYTHONHOME 234 | if (Test-Path -Path Env:PYTHONHOME) { 235 | Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME 236 | Remove-Item -Path Env:PYTHONHOME 237 | } 238 | 239 | # Add the venv to the PATH 240 | Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH 241 | $Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" 242 | 243 | # SIG # Begin signature block 244 | # MIIc9wYJKoZIhvcNAQcCoIIc6DCCHOQCAQExDzANBglghkgBZQMEAgEFADB5Bgor 245 | # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG 246 | # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAwnDYwEHaCQq0n 247 | # 8NAvsN7H7BO7/48rXCNwrg891FS5vaCCC38wggUwMIIEGKADAgECAhAECRgbX9W7 248 | # ZnVTQ7VvlVAIMA0GCSqGSIb3DQEBCwUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK 249 | # EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV 250 | # BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0xMzEwMjIxMjAwMDBa 251 | # Fw0yODEwMjIxMjAwMDBaMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy 252 | # dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lD 253 | # ZXJ0IFNIQTIgQXNzdXJlZCBJRCBDb2RlIFNpZ25pbmcgQ0EwggEiMA0GCSqGSIb3 254 | # DQEBAQUAA4IBDwAwggEKAoIBAQD407Mcfw4Rr2d3B9MLMUkZz9D7RZmxOttE9X/l 255 | # qJ3bMtdx6nadBS63j/qSQ8Cl+YnUNxnXtqrwnIal2CWsDnkoOn7p0WfTxvspJ8fT 256 | # eyOU5JEjlpB3gvmhhCNmElQzUHSxKCa7JGnCwlLyFGeKiUXULaGj6YgsIJWuHEqH 257 | # CN8M9eJNYBi+qsSyrnAxZjNxPqxwoqvOf+l8y5Kh5TsxHM/q8grkV7tKtel05iv+ 258 | # bMt+dDk2DZDv5LVOpKnqagqrhPOsZ061xPeM0SAlI+sIZD5SlsHyDxL0xY4PwaLo 259 | # LFH3c7y9hbFig3NBggfkOItqcyDQD2RzPJ6fpjOp/RnfJZPRAgMBAAGjggHNMIIB 260 | # yTASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAK 261 | # BggrBgEFBQcDAzB5BggrBgEFBQcBAQRtMGswJAYIKwYBBQUHMAGGGGh0dHA6Ly9v 262 | # Y3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3aHR0cDovL2NhY2VydHMuZGln 263 | # aWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNydDCBgQYDVR0fBHow 264 | # eDA6oDigNoY0aHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJl 265 | # ZElEUm9vdENBLmNybDA6oDigNoY0aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0Rp 266 | # Z2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDBPBgNVHSAESDBGMDgGCmCGSAGG/WwA 267 | # AgQwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAK 268 | # BghghkgBhv1sAzAdBgNVHQ4EFgQUWsS5eyoKo6XqcQPAYPkt9mV1DlgwHwYDVR0j 269 | # BBgwFoAUReuir/SSy4IxLVGLp6chnfNtyA8wDQYJKoZIhvcNAQELBQADggEBAD7s 270 | # DVoks/Mi0RXILHwlKXaoHV0cLToaxO8wYdd+C2D9wz0PxK+L/e8q3yBVN7Dh9tGS 271 | # dQ9RtG6ljlriXiSBThCk7j9xjmMOE0ut119EefM2FAaK95xGTlz/kLEbBw6RFfu6 272 | # r7VRwo0kriTGxycqoSkoGjpxKAI8LpGjwCUR4pwUR6F6aGivm6dcIFzZcbEMj7uo 273 | # +MUSaJ/PQMtARKUT8OZkDCUIQjKyNookAv4vcn4c10lFluhZHen6dGRrsutmQ9qz 274 | # sIzV6Q3d9gEgzpkxYz0IGhizgZtPxpMQBvwHgfqL2vmCSfdibqFT+hKUGIUukpHq 275 | # aGxEMrJmoecYpJpkUe8wggZHMIIFL6ADAgECAhADPtXtoGXRuMkd/PkqbJvYMA0G 276 | # CSqGSIb3DQEBCwUAMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ 277 | # bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lDZXJ0 278 | # IFNIQTIgQXNzdXJlZCBJRCBDb2RlIFNpZ25pbmcgQ0EwHhcNMTgxMjE4MDAwMDAw 279 | # WhcNMjExMjIyMTIwMDAwWjCBgzELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU5ldyBI 280 | # YW1wc2hpcmUxEjAQBgNVBAcTCVdvbGZlYm9ybzEjMCEGA1UEChMaUHl0aG9uIFNv 281 | # ZnR3YXJlIEZvdW5kYXRpb24xIzAhBgNVBAMTGlB5dGhvbiBTb2Z0d2FyZSBGb3Vu 282 | # ZGF0aW9uMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAqr2kS7J1uW7o 283 | # JRxlsdrETAjKarfoH5TI8PWST6Yb2xPooP7vHT4iaVXyL5Lze1f53Jw67Sp+u524 284 | # fJXf30qHViEWxumy2RWG0nciU2d+mMqzjlaAWSZNF0u4RcvyDJokEV0RUOqI5CG5 285 | # zPI3W9uQ6LiUk3HCYW6kpH177A5T3pw/Po8O8KErJGn1anaqtIICq99ySxrMad/2 286 | # hPMBRf6Ndah7f7HPn1gkSSTAoejyuqF5h+B0qI4+JK5+VLvz659VTbAWJsYakkxZ 287 | # xVWYpFv4KeQSSwoo0DzMvmERsTzNvVBMWhu9OriJNg+QfFmf96zVTu93cZ+r7xMp 288 | # bXyfIOGKhHMaRuZ8ihuWIx3gI9WHDFX6fBKR8+HlhdkaiBEWIsXRoy+EQUyK7zUs 289 | # +FqOo2sRYttbs8MTF9YDKFZwyPjn9Wn+gLGd5NUEVyNvD9QVGBEtN7vx87bduJUB 290 | # 8F4DylEsMtZTfjw/au6AmOnmneK5UcqSJuwRyZaGNk7y3qj06utx+HTTqHgi975U 291 | # pxfyrwAqkovoZEWBVSpvku8PVhkBXcLmNe6MEHlFiaMoiADAeKmX5RFRkN+VrmYG 292 | # Tg4zajxfdHeIY8TvLf48tTfmnQJd98geJQv/01NUy/FxuwqAuTkaez5Nl1LxP0Cp 293 | # THhghzO4FRD4itT2wqTh4jpojw9QZnsCAwEAAaOCAcUwggHBMB8GA1UdIwQYMBaA 294 | # FFrEuXsqCqOl6nEDwGD5LfZldQ5YMB0GA1UdDgQWBBT8Kr9+1L6s84KcpM97IgE7 295 | # uI8H8jAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwdwYDVR0f 296 | # BHAwbjA1oDOgMYYvaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJl 297 | # ZC1jcy1nMS5jcmwwNaAzoDGGL2h0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9zaGEy 298 | # LWFzc3VyZWQtY3MtZzEuY3JsMEwGA1UdIARFMEMwNwYJYIZIAYb9bAMBMCowKAYI 299 | # KwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCAYGZ4EMAQQB 300 | # MIGEBggrBgEFBQcBAQR4MHYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2lj 301 | # ZXJ0LmNvbTBOBggrBgEFBQcwAoZCaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29t 302 | # L0RpZ2lDZXJ0U0hBMkFzc3VyZWRJRENvZGVTaWduaW5nQ0EuY3J0MAwGA1UdEwEB 303 | # /wQCMAAwDQYJKoZIhvcNAQELBQADggEBAEt1oS21X0axiafPjyY+vlYqjWKuUu/Y 304 | # FuYWIEq6iRRaFabNDhj9RBFQF/aJiE5msrQEOfAD6/6gVSH91lZWBqg6NEeG9T9S 305 | # XbiAPvJ9CEWFsdkXUrjbWhvCnuZ7kqUuU5BAumI1QRbpYgZL3UA+iZXkmjbGh1ln 306 | # 8rUhWIxbBYL4Sg2nqpB44p7CUFYkPj/MbwU2gvBV2pXjj5WaskoZtsACMv5g42BN 307 | # oVLoRAi+ev6s07POt+JtHRIm87lTyuc8wh0swTPUwksKbLU1Zdj9CpqtzXnuVE0w 308 | # 50exJvRSK3Vt4g+0vigpI3qPmDdpkf9+4Mvy0XMNcqrthw20R+PkIlMxghDOMIIQ 309 | # ygIBATCBhjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkw 310 | # FwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEy 311 | # IEFzc3VyZWQgSUQgQ29kZSBTaWduaW5nIENBAhADPtXtoGXRuMkd/PkqbJvYMA0G 312 | # CWCGSAFlAwQCAQUAoIGYMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisG 313 | # AQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCwGCisGAQQBgjcCAQwxHjAcoBqAGABQ 314 | # AHkAdABoAG8AbgAgADMALgA5AC4ANzAvBgkqhkiG9w0BCQQxIgQgBrni4mcRv7sM 315 | # JHsxpROjRopOz2wuQVrJnn+lD7X7y+gwDQYJKoZIhvcNAQEBBQAEggIAlpjGHgZ7 316 | # CPnoJRAJIxIBpQAvUTGheJi/uP1gtaPWRvcxP8tQvtvdTd9aMrsZnNy0gdaa5WL3 317 | # yYMzA0Ytzwfh0fsGuQjdx1ht/J8U++D/Lfl/w+rdbZ4mXhjnbqmTAJknEDW4NEWa 318 | # mwyhp+5zzADBp2VkryFpB3B7K04u8CyxXpRG6no86ROHkmsOk4j2mZUP9g/Hx4tv 319 | # eWjakNMPkdXZ7tWtkGNWbwOYDosvSt1aCDld5TE2o2CHOJJpi06rHRI4o4X2gNRO 320 | # rk8+6pH0XTS0//OMfHZRcDtRgJ7ohU/v2CDRuDw/b5NH1S1kwbdLpOoVw1bTrjsx 321 | # jOotJbVUuPO3ES0ZzidPbEejPz1/D/z6Yl01KfbQJ9DanTzPhQw/hCezsUUsKZBR 322 | # iZ1WWqZmZaT3faO/VwumIeQEa4XlGMcviEuyRye09nx3E+d9Gu8eCwm3RLD8rRDb 323 | # J1+GIZDkBi+Qebo3hao16666J+dezjV6HO50NkXeY/1I43A/P2nXtwqsAuaO+h/X 324 | # +3enzdtZx4HZa7E7wQ2F3daOV69IOliB6PCUfzPB4bqoms7c85YKEb3ZDYPX+Igf 325 | # EPDOQd+U3pvXLvzaJj8RL+g+s2/xaPm4KrzpKXr4SO4Voje6p0Keso/6/pErSfAf 326 | # OFWx+zhUKELWbCZLzdDZ76IuT0V8arqtTK+hgg19MIINeQYKKwYBBAGCNwMDATGC 327 | # DWkwgg1lBgkqhkiG9w0BBwKggg1WMIINUgIBAzEPMA0GCWCGSAFlAwQCAQUAMHcG 328 | # CyqGSIb3DQEJEAEEoGgEZjBkAgEBBglghkgBhv1sBwEwMTANBglghkgBZQMEAgEF 329 | # AAQgOSCrDv+oDMEj/ophQEUCc8G75r8sYGG8KKaH7Fm+WY0CEFzwQrsuwLerUKVb 330 | # vYKnHYEYDzIwMjEwODMwMjAzMjQwWqCCCjcwggT+MIID5qADAgECAhANQkrgvjqI 331 | # /2BAIc4UAPDdMA0GCSqGSIb3DQEBCwUAMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK 332 | # EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNV 333 | # BAMTKERpZ2lDZXJ0IFNIQTIgQXNzdXJlZCBJRCBUaW1lc3RhbXBpbmcgQ0EwHhcN 334 | # MjEwMTAxMDAwMDAwWhcNMzEwMTA2MDAwMDAwWjBIMQswCQYDVQQGEwJVUzEXMBUG 335 | # A1UEChMORGlnaUNlcnQsIEluYy4xIDAeBgNVBAMTF0RpZ2lDZXJ0IFRpbWVzdGFt 336 | # cCAyMDIxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwuZhhGfFivUN 337 | # CKRFymNrUdc6EUK9CnV1TZS0DFC1JhD+HchvkWsMlucaXEjvROW/m2HNFZFiWrj/ 338 | # ZwucY/02aoH6KfjdK3CF3gIY83htvH35x20JPb5qdofpir34hF0edsnkxnZ2OlPR 339 | # 0dNaNo/Go+EvGzq3YdZz7E5tM4p8XUUtS7FQ5kE6N1aG3JMjjfdQJehk5t3Tjy9X 340 | # tYcg6w6OLNUj2vRNeEbjA4MxKUpcDDGKSoyIxfcwWvkUrxVfbENJCf0mI1P2jWPo 341 | # GqtbsR0wwptpgrTb/FZUvB+hh6u+elsKIC9LCcmVp42y+tZji06lchzun3oBc/gZ 342 | # 1v4NSYS9AQIDAQABo4IBuDCCAbQwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQC 343 | # MAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwQQYDVR0gBDowODA2BglghkgBhv1s 344 | # BwEwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMB8G 345 | # A1UdIwQYMBaAFPS24SAd/imu0uRhpbKiJbLIFzVuMB0GA1UdDgQWBBQ2RIaOpLqw 346 | # Zr68KC0dRDbd42p6vDBxBgNVHR8EajBoMDKgMKAuhixodHRwOi8vY3JsMy5kaWdp 347 | # Y2VydC5jb20vc2hhMi1hc3N1cmVkLXRzLmNybDAyoDCgLoYsaHR0cDovL2NybDQu 348 | # ZGlnaWNlcnQuY29tL3NoYTItYXNzdXJlZC10cy5jcmwwgYUGCCsGAQUFBwEBBHkw 349 | # dzAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tME8GCCsGAQUF 350 | # BzAChkNodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRTSEEyQXNz 351 | # dXJlZElEVGltZXN0YW1waW5nQ0EuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQBIHNy1 352 | # 6ZojvOca5yAOjmdG/UJyUXQKI0ejq5LSJcRwWb4UoOUngaVNFBUZB3nw0QTDhtk7 353 | # vf5EAmZN7WmkD/a4cM9i6PVRSnh5Nnont/PnUp+Tp+1DnnvntN1BIon7h6JGA078 354 | # 9P63ZHdjXyNSaYOC+hpT7ZDMjaEXcw3082U5cEvznNZ6e9oMvD0y0BvL9WH8dQgA 355 | # dryBDvjA4VzPxBFy5xtkSdgimnUVQvUtMjiB2vRgorq0Uvtc4GEkJU+y38kpqHND 356 | # Udq9Y9YfW5v3LhtPEx33Sg1xfpe39D+E68Hjo0mh+s6nv1bPull2YYlffqe0jmd4 357 | # +TaY4cso2luHpoovMIIFMTCCBBmgAwIBAgIQCqEl1tYyG35B5AXaNpfCFTANBgkq 358 | # hkiG9w0BAQsFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5j 359 | # MRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBB 360 | # c3N1cmVkIElEIFJvb3QgQ0EwHhcNMTYwMTA3MTIwMDAwWhcNMzEwMTA3MTIwMDAw 361 | # WjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL 362 | # ExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFzc3Vy 363 | # ZWQgSUQgVGltZXN0YW1waW5nIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB 364 | # CgKCAQEAvdAy7kvNj3/dqbqCmcU5VChXtiNKxA4HRTNREH3Q+X1NaH7ntqD0jbOI 365 | # 5Je/YyGQmL8TvFfTw+F+CNZqFAA49y4eO+7MpvYyWf5fZT/gm+vjRkcGGlV+Cyd+ 366 | # wKL1oODeIj8O/36V+/OjuiI+GKwR5PCZA207hXwJ0+5dyJoLVOOoCXFr4M8iEA91 367 | # z3FyTgqt30A6XLdR4aF5FMZNJCMwXbzsPGBqrC8HzP3w6kfZiFBe/WZuVmEnKYmE 368 | # UeaC50ZQ/ZQqLKfkdT66mA+Ef58xFNat1fJky3seBdCEGXIX8RcG7z3N1k3vBkL9 369 | # olMqT4UdxB08r8/arBD13ays6Vb/kwIDAQABo4IBzjCCAcowHQYDVR0OBBYEFPS2 370 | # 4SAd/imu0uRhpbKiJbLIFzVuMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6enIZ3z 371 | # bcgPMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQM 372 | # MAoGCCsGAQUFBwMIMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYYaHR0cDov 373 | # L29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2FjZXJ0cy5k 374 | # aWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MIGBBgNVHR8E 375 | # ejB4MDqgOKA2hjRodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1 376 | # cmVkSURSb290Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20v 377 | # RGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMFAGA1UdIARJMEcwOAYKYIZIAYb9 378 | # bAACBDAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT 379 | # MAsGCWCGSAGG/WwHATANBgkqhkiG9w0BAQsFAAOCAQEAcZUS6VGHVmnN793afKpj 380 | # erN4zwY3QITvS4S/ys8DAv3Fp8MOIEIsr3fzKx8MIVoqtwU0HWqumfgnoma/Capg 381 | # 33akOpMP+LLR2HwZYuhegiUexLoceywh4tZbLBQ1QwRostt1AuByx5jWPGTlH0gQ 382 | # GF+JOGFNYkYkh2OMkVIsrymJ5Xgf1gsUpYDXEkdws3XVk4WTfraSZ/tTYYmo9WuW 383 | # wPRYaQ18yAGxuSh1t5ljhSKMYcp5lH5Z/IwP42+1ASa2bKXuh1Eh5Fhgm7oMLStt 384 | # osR+u8QlK0cCCHxJrhO24XxCQijGGFbPQTS2Zl22dHv1VjMiLyI2skuiSpXY9aaO 385 | # UjGCAoYwggKCAgEBMIGGMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy 386 | # dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lD 387 | # ZXJ0IFNIQTIgQXNzdXJlZCBJRCBUaW1lc3RhbXBpbmcgQ0ECEA1CSuC+Ooj/YEAh 388 | # zhQA8N0wDQYJYIZIAWUDBAIBBQCggdEwGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJ 389 | # EAEEMBwGCSqGSIb3DQEJBTEPFw0yMTA4MzAyMDMyNDBaMCsGCyqGSIb3DQEJEAIM 390 | # MRwwGjAYMBYEFOHXgqjhkb7va8oWkbWqtJSmJJvzMC8GCSqGSIb3DQEJBDEiBCBI 391 | # G7lS/r0RCENJotqNy8WPsrW/fmVFip107NYjeJ0Q0TA3BgsqhkiG9w0BCRACLzEo 392 | # MCYwJDAiBCCzEJAGvArZgweRVyngRANBXIPjKSthTyaWTI01cez1qTANBgkqhkiG 393 | # 9w0BAQEFAASCAQBLFNmzEWXnvby6UBfPXhcIQetEVjem6zU9lbSj5MXY7ZJDCtV/ 394 | # cdI6SWEsz1uZyzNlHvBvctGK03lZcWcwa0PrGokLG2v3zuU1MAj2MJVuunQ5GjaI 395 | # UoWDeROFwEBtqKnR+hTB2GV/pOb1nEHR6xm4KvMao0WcnkQhVL3LXVVawDSJIrA8 396 | # 8I5XyqZx3q6jRFVAuIlM6HLrQiaLRpP9j25/1Pin8zLd0e65jaAufHQW6V7vG3GI 397 | # C9d89LkmDN7uftGjXS5LKiC4EYMYKK8L3/ikBW70mATlDXZfLBoEdAv1rUoIXnf2 398 | # 7AxXiMi4hXF2JsMk/J2h9lfvENROxXGIStD1 399 | # SIG # End signature block 400 | -------------------------------------------------------------------------------- /environment/Scripts/activate: -------------------------------------------------------------------------------- 1 | # This file must be used with "source bin/activate" *from bash* 2 | # you cannot run it directly 3 | 4 | deactivate () { 5 | # reset old environment variables 6 | if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then 7 | PATH="${_OLD_VIRTUAL_PATH:-}" 8 | export PATH 9 | unset _OLD_VIRTUAL_PATH 10 | fi 11 | if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then 12 | PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" 13 | export PYTHONHOME 14 | unset _OLD_VIRTUAL_PYTHONHOME 15 | fi 16 | 17 | # This should detect bash and zsh, which have a hash command that must 18 | # be called to get it to forget past commands. Without forgetting 19 | # past commands the $PATH changes we made may not be respected 20 | if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then 21 | hash -r 2> /dev/null 22 | fi 23 | 24 | if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then 25 | PS1="${_OLD_VIRTUAL_PS1:-}" 26 | export PS1 27 | unset _OLD_VIRTUAL_PS1 28 | fi 29 | 30 | unset VIRTUAL_ENV 31 | if [ ! "${1:-}" = "nondestructive" ] ; then 32 | # Self destruct! 33 | unset -f deactivate 34 | fi 35 | } 36 | 37 | # unset irrelevant variables 38 | deactivate nondestructive 39 | 40 | VIRTUAL_ENV="C:\Code\Jumpstart\jumpstartCS-rabbitmq-python\environment" 41 | export VIRTUAL_ENV 42 | 43 | _OLD_VIRTUAL_PATH="$PATH" 44 | PATH="$VIRTUAL_ENV/Scripts:$PATH" 45 | export PATH 46 | 47 | # unset PYTHONHOME if set 48 | # this will fail if PYTHONHOME is set to the empty string (which is bad anyway) 49 | # could use `if (set -u; : $PYTHONHOME) ;` in bash 50 | if [ -n "${PYTHONHOME:-}" ] ; then 51 | _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" 52 | unset PYTHONHOME 53 | fi 54 | 55 | if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then 56 | _OLD_VIRTUAL_PS1="${PS1:-}" 57 | PS1="(environment) ${PS1:-}" 58 | export PS1 59 | fi 60 | 61 | # This should detect bash and zsh, which have a hash command that must 62 | # be called to get it to forget past commands. Without forgetting 63 | # past commands the $PATH changes we made may not be respected 64 | if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then 65 | hash -r 2> /dev/null 66 | fi 67 | -------------------------------------------------------------------------------- /environment/Scripts/activate.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | rem This file is UTF-8 encoded, so we need to update the current code page while executing it 4 | for /f "tokens=2 delims=:." %%a in ('"%SystemRoot%\System32\chcp.com"') do ( 5 | set _OLD_CODEPAGE=%%a 6 | ) 7 | if defined _OLD_CODEPAGE ( 8 | "%SystemRoot%\System32\chcp.com" 65001 > nul 9 | ) 10 | 11 | set VIRTUAL_ENV=C:\Code\Jumpstart\jumpstartCS-rabbitmq-python\environment 12 | 13 | if not defined PROMPT set PROMPT=$P$G 14 | 15 | if defined _OLD_VIRTUAL_PROMPT set PROMPT=%_OLD_VIRTUAL_PROMPT% 16 | if defined _OLD_VIRTUAL_PYTHONHOME set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME% 17 | 18 | set _OLD_VIRTUAL_PROMPT=%PROMPT% 19 | set PROMPT=(environment) %PROMPT% 20 | 21 | if defined PYTHONHOME set _OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME% 22 | set PYTHONHOME= 23 | 24 | if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH% 25 | if not defined _OLD_VIRTUAL_PATH set _OLD_VIRTUAL_PATH=%PATH% 26 | 27 | set PATH=%VIRTUAL_ENV%\Scripts;%PATH% 28 | 29 | :END 30 | if defined _OLD_CODEPAGE ( 31 | "%SystemRoot%\System32\chcp.com" %_OLD_CODEPAGE% > nul 32 | set _OLD_CODEPAGE= 33 | ) 34 | -------------------------------------------------------------------------------- /environment/Scripts/deactivate.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | if defined _OLD_VIRTUAL_PROMPT ( 4 | set "PROMPT=%_OLD_VIRTUAL_PROMPT%" 5 | ) 6 | set _OLD_VIRTUAL_PROMPT= 7 | 8 | if defined _OLD_VIRTUAL_PYTHONHOME ( 9 | set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%" 10 | set _OLD_VIRTUAL_PYTHONHOME= 11 | ) 12 | 13 | if defined _OLD_VIRTUAL_PATH ( 14 | set "PATH=%_OLD_VIRTUAL_PATH%" 15 | ) 16 | 17 | set _OLD_VIRTUAL_PATH= 18 | 19 | set VIRTUAL_ENV= 20 | 21 | :END 22 | -------------------------------------------------------------------------------- /environment/Scripts/pip.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delaneybrian/jumpstartCS-rabbitmq-python/758ab7c8633433d1f74d45fc7da5fb7bdd920639/environment/Scripts/pip.exe -------------------------------------------------------------------------------- /environment/Scripts/pip3.9.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delaneybrian/jumpstartCS-rabbitmq-python/758ab7c8633433d1f74d45fc7da5fb7bdd920639/environment/Scripts/pip3.9.exe -------------------------------------------------------------------------------- /environment/Scripts/pip3.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delaneybrian/jumpstartCS-rabbitmq-python/758ab7c8633433d1f74d45fc7da5fb7bdd920639/environment/Scripts/pip3.exe -------------------------------------------------------------------------------- /environment/Scripts/python.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delaneybrian/jumpstartCS-rabbitmq-python/758ab7c8633433d1f74d45fc7da5fb7bdd920639/environment/Scripts/python.exe -------------------------------------------------------------------------------- /environment/Scripts/pythonw.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delaneybrian/jumpstartCS-rabbitmq-python/758ab7c8633433d1f74d45fc7da5fb7bdd920639/environment/Scripts/pythonw.exe -------------------------------------------------------------------------------- /environment/pyvenv.cfg: -------------------------------------------------------------------------------- 1 | home = C:\Users\delan\AppData\Local\Programs\Python\Python39 2 | include-system-site-packages = false 3 | version = 3.9.7 4 | --------------------------------------------------------------------------------