1

我正在尝试在 Google App Engine 上使用 py-amqplib 与 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 实现有关。

我已经验证,当我在本地运行代码并通过应用程序引擎开发服务器时,连接会正确关闭(即当它不使用远程套接字时)。

所以我正在寻找两件事之一:

1) 关闭 amqp 连接而不引发套接字错误的替代方法,或确认尽管出现错误,但套接字已关闭且未保持打开状态。

2) 与应用程序引擎一起使用的备用 amqp python 模块。我试过'amqp',它是'amqplib'的分支,但它需要ctypes并且无法加载到应用程序引擎上。我试过 pika,由于 fnctrl 模块,它在应用引擎上也失败了。Carrot 和 Kombu 都有可交换的后端,但它们似乎要么依赖于 c-libraries,要么使用 amqplib 作为后端。

4

0 回答 0