繁体   English   中英

Python Flask Pika Consumer (RabbitMQ)

[英]Python Flask Pika Consumer (RabbitMQ)

我有两个小

蟒蛇烧瓶

应用

  1. Appone --> 制作人
  2. Apptwo --> 消费者

两者都在不同的docker-container并由docker-compose编排

我不从生产者到消费者拿到的数据......甚至当我开始在apptwo的start.consuming()生产者不能发送任何数据到RabbitMQ的经纪人也许有人可以帮助我。 非常感谢

码头工人组成:

version: '3'
services:

  appone:
    container_name: appone
    restart: always
    build:
      context: ./appone
      dockerfile: Dockerfile
    environment:
      FLASK_APP: ./app.py        
    volumes:
      - './appone:/code/:cached'
    ports:
      - "5001:5001"

  apptwo:
    container_name: apptwo
    restart: always
    build:
      context: ./apptwo
      dockerfile: Dockerfile
    environment:
      FLASK_DEBUG: 1
      FLASK_APP: ./app.py         
    volumes:
      - ./apptwo:/code:cached 
    ports:
      - "5002:5002"     

  rabbitmq:
    image: "rabbitmq:3-management"
    hostname: "rabbit"
    ports:
      - "15672:15672"
      - "5672:5672"
    labels:
      NAME: "rabbitmq"
    volumes:
      - ./rabbitmq/rabbitmq-isolated.conf:/etc/rabbitmq/rabbitmq.config

阿彭(制作人)

from flask import Flask
from flask_restful import Resource, Api
import pika

app = Flask(__name__)
api = Api(app)

app.config['DEBUG'] = True

message = "Hello World, its me appone"


class HelloWorld(Resource):
    def get(self):
        connection = pika.BlockingConnection(
            pika.ConnectionParameters(host='rabbitmq'))
        channel = connection.channel()

        channel.queue_declare(queue='hello', durable=True)

        channel.basic_publish(exchange='', routing_key='hello', body='Hello World!', properties=pika.BasicProperties(delivery_mode=2))

        connection.close()

        return {'message': message}


api.add_resource(HelloWorld, '/api/appone/post')

if __name__ == '__main__':
    # Development
    app.run(host="0.0.0.0", port=5001)

apptwo(消费者)

from flask import Flask
from flask_restful import Resource, Api
import pika
from threading import Thread

app = Flask(__name__)
api = Api(app)

app.config['DEBUG'] = True

data = []

connection = pika.BlockingConnection(
    pika.ConnectionParameters(host='rabbitmq'))

channel = connection.channel()

channel.queue_declare(queue='hello', durable=True)

def callback(ch, method, properties, body):
    data.append(body)
    ch.basic_ack(delivery_tag = method.delivery_tag)

channel.basic_consume(queue='hello', on_message_callback=callback)

thread = Thread(channel.start_consuming())
thread.start()

class HelloWorld(Resource):
    def get(self):
        return {'message': data}

api.add_resource(HelloWorld, '/api/apptwo/get')

if __name__ == '__main__':
    app.run(debug=True, host="0.0.0.0", port=5002)

目标在这个简单的例子中,我只想接收 apptwo 中的数据并将其存储在数据列表中......

再次感谢!!

在 apptwo(消费者)中:

thread = Thread(channel.start_consuming())
thread.start()

这里从不调用 Thread 的构造函数调用,因为之前调用了 channel.start_sumption,这是阻塞的。 将您的代码更改为以下内容可能会有所帮助。

thread = Thread(target = channel.start_consuming)
thread.start()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM