尝试从另一个容器连接到RabbitMQ时,为什么会收到“ IncompatibleProtocolError”?

时间:2019-09-11 09:05:30

标签: docker docker-compose rabbitmq

我正在构建一个docker-compose文件。我启动RabbitMQ容器并将必要的端口绑定到主机。然后,我试图从另一个容器连接到它。

因此,如下所示,我将network_mode选项设置为host,因此我可以使用localhost作为队列的主机名。在下面,您可以看到docker-compose yaml文件:

version: '3'

services:
  queue:
    image: "rabbitmq:3"
    ports:
      - "5672:5672"
      - "15672:15672"
  worker:
    image: "some_image"
    network_mode: "host"
    depends_on: 
      - queue

运行代码时,工作程序尝试使用主机名localhost连接到RabbitMQ,但出现IncompatibleProtocolError: StreamLostError: ('Transport indicated EOF',)错误。具体来说:

File "/usr/local/lib/python3.7/site-packages/pika/adapters/blocking_connection.py", line 359, in __init__
recommender_filtering_worker_1  |     self._impl = self._create_connection(parameters, _impl_class)
recommender_filtering_worker_1  |   File "/usr/local/lib/python3.7/site-packages/pika/adapters/blocking_connection.py", line 450, in _create_connection
recommender_filtering_worker_1  |     raise self._reap_last_connection_workflow_error(error)
recommender_filtering_worker_1  | pika.exceptions.IncompatibleProtocolError: StreamLostError: ('Transport indicated EOF',)

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

问题似乎是您的应用程序没有等待队列“准备就绪”以接受连接。 if (CheckArea(point.NormalLine, clickX, clickY) || CheckArea(point.ReverseLine, clickX, clickY)) { MenuItem header = new MenuItem{ Header = point.Name}; MenuItem norm = new MenuItem { Header ="Normal"}; MenuItem reverse = new MenuItem { Header ="Reverse"}; Separator sep = new Separator { }; norm.Command = point.SetNormalCommand; reverse.Command = point.SetReverseCommand; contextMenu = new ContextMenu(); contextMenu.Items.Add(header); contextMenu.Items.Add(sep); contextMenu.Items.Add(norm); contextMenu.Items.Add(reverse); contextMenu.IsOpen = true; _window.ContextMenu = contextMenu; break; } else { contextMenu.IsOpen = false; _window.ContextMenu = null; } 块可确保您的队列容器在工作线程之前启动,但不能保证您的队列已准备好接受连接。

这里可以采用不同的解决方案。一直打队列,直到它回答为止(不是持续不断,但可能每10-15秒一次)或添加“ wait_for”脚本(https://github.com/eficode/wait-for)。