我正在尝试在 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 作为后端。