编写RabbitMQ的简单生产者/消费者示例,我无法让我的消费者容器继续在 if (guessedNumber < randomNumber) {
System.out.println("The number is bigger");
} else if (guessedNumber > randomNumber) {
System.out.println("The number is smaller");
} else{
x++;
}
上运行。它应该在无限循环上运行。
正如您所见,我可以在运行docker-compose up -d
以及docker-compose run consumer
docker-compose run -d consumer
正如您所看到的那样,这是相当直接的。基本上从RabbitMQ文档复制它。在写了大部分内容之后我跑了#!/usr/bin/env python
import argparse
import pika
import json
connection = None
channel = None
TYPES = ['producer', 'consumer']
def producer():
global connection, channel
connection = pika.BlockingConnection(pika.ConnectionParameters('rabbit'))
channel = connection.channel()
channel.queue_declare(queue='hello')
# Currently a python dict
data = {
'key': 'myvalue'
}
channel.basic_publish(exchange='',
routing_key='hello',
body=json.dumps(data)) # Encode as a JSON string
print(f' [x] Sent {data}')
connection.close()
def consumer():
global connection, channel
connection = pika.BlockingConnection(pika.ConnectionParameters('rabbit'))
channel = connection.channel()
channel.queue_declare(queue='hello')
def callback(ch, method, properties, body):
data = json.loads(body) # decode JSON string into a python dict
print(f' [x] Received: {data} type {type(data)}')
channel.basic_consume(callback,
queue='hello',
no_ack=True)
print(' [*] Waiting for messages. To exit press CTRL+C')
# Infinite loop
try:
channel.start_consuming()
except KeyboardInterrupt:
print('\nExiting...')
def main():
parser = argparse.ArgumentParser()
parser.add_argument('type', help='producer/consumer')
args = parser.parse_args()
client_type = args.type.lower()
if client_type not in TYPES:
print(f'{client_type} is not a valid type {TYPES}')
elif client_type == TYPES[0]:
producer()
elif client_type == TYPES[1]:
consumer()
if __name__ == '__main__':
main()
并获得了以下内容。
这表明它无法在初始构建时连接。即使在初始构建之后运行docker-compose logs consumer
,它也无法熬夜。
docker-compose up
我使用version: '3'
services:
producer:
build: .
consumer:
build: .
depends_on:
- rabbit
command: example consumer
rabbit:
image: rabbitmq:3.6
,因为我认为应该确保在RabbitMQ服务之后构建消费者服务。
代码回复是here
答案 0 :(得分:0)
您是否尝试使用consumer
关键字为restart
容器设置重启策略?在这些情况下经常发生的情况是,您的应用程序在该服务运行之前尝试连接到后端服务(在本例中为RabbitMQ)并且一切都会爆炸。如果您设置了重启策略,则docker将自动重启容器,希望此时您的后端服务将启动并运行。
有一些更为优雅的方法可以做到这一点,但在最简单的形式下,这对你有用。
您可以通过重新启动消费者容器并查看其是否保持正常来测试我的理论。
docker-compose restart consumer