Ошибка закрытия соединения py-amqplib только в Google App Engine

Я пытаюсь использовать py-amqplib в Google App Engine для связи с кластером rabbitmq (также хостом на App Engine). У меня все работает, как и ожидалось, за исключением того, что, когда я иду, чтобы закрыть соединение, я выдал исключение

Exception on /api/***** [POST]
    ....
    conn.close()
  File "/base/data/home/apps/s~proj/1.382630193282536254/lib/amqplib/client_0_8/connection.py", line 314, in close
    (10, 61),    # Connection.close_ok
  File "/base/data/home/apps/s~project/1.382630193282536254/lib/amqplib/client_0_8/abstract_channel.py", line 97, in wait
    return self.dispatch_method(method_sig, args, content)
  File "/base/data/home/apps/s~project/1.382630193282536254/lib/amqplib/client_0_8/abstract_channel.py", line 115, in dispatch_method
    return amqp_method(self, args)
  File "/base/data/home/apps/s~project/1.382630193282536254/lib/amqplib/client_0_8/connection.py", line 415, in _close_ok
    self._do_close()
  File "/base/data/home/apps/s~project/1.382630193282536254/lib/amqplib/client_0_8/connection.py", line 160, in _do_close
    self.transport.close()
  File "/base/data/home/apps/s~project/1.382630193282536254/lib/amqplib/client_0_8/transport.py", line 139, in close
    self.sock.shutdown(socket.SHUT_RDWR)
  File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/socket.py", line 222, in meth
    return getattr(self._sock,name)(*args)
  File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/remote_socket/_remote_socket.py", line 1148, in shutdown
    raise _SystemExceptionFromAppError(e)
error: [Errno 22] Invalid argument

Я предполагаю, что это связано с реализацией remote_socket движка приложения, которая берет на себя всю исходящую связь сокетов.

Я убедился, что когда я запускаю код локально и через dev-сервер приложений, соединение закрывается должным образом (т. Е. Когда не используются удаленные сокеты).

Поэтому я ищу одну из двух вещей:

1) альтернативный способ отключения соединения amqp без выдачи ошибки сокета или подтверждение того, что, несмотря на ошибку, сокет закрыт и не оставлен открытым.

2) Альтернативный модуль Python amqp, который работает с движком приложения. Я пробовал 'amqp', который является вилкой для 'amqplib', но он требует ctypes и не смог загрузиться на app-engine. Я пробовал pika, которая также не работает на движке приложения из-за модуля fnctrl. У Carrot и Kombu есть сменный бэкэнд, но, похоже, они либо зависят от c-библиотек, либо используют amqplib в качестве бэкенда.

0 ответов

Другие вопросы по тегам