在 python spyne 中预服务状态(如数据库连接)
Preservice a state in python spyne (like a db connection)
我在 gunicorn 服务器 v19.9
上使用 python v3.5 和包 spyne 2.13 运行
我用 python spyne 编写了一个小型 SOAP Web 服务(运行良好)。它接受一个字符串并将其排队到 rabbitmq。它不一定是rabbitmq,也可以是一个简单的DB insert oslt。现在它工作正常,但每次调用网络服务时,它
- 打开一个 rabbitmq 连接(如果你愿意,也可以打开一个数据库连接)
- 发送消息
- 再次关闭连接(?)
我想以某种方式保留某种 'instance variable' 的连接,并在每次调用 Webservice 时重新使用它。这样它只连接一次而不是每次我调用 ws.不幸的是,spyne 似乎没有创建任何对象,因此没有实例变量。
一般:使用 spyne 时如何保存状态(DB 或 RabbitMQ 连接)?
所以我用静态 class 属性尝试了这个 Trick,如下所示:
class Ws2RabbitMQ(ServiceBase):
rabbit_connection = pika.BlockingConnection(
pika.ConnectionParameters(host='localhost'))
rabbit_channel = rabbit_connection.channel()
@staticmethod
def connectRabbit():
rabbit_cred = pika.PlainCredentials(username='...', password='...')
Ws2RabbitMQ.rabbit_connection = pika.BlockingConnection(pika.ConnectionParameters(
host='...', virtual_host='...', credentials=rabbit_cred))
Ws2RabbitMQ.rabbit_channel = Ws2RabbitMQ.rabbit_connection.channel()
print('Rabbit connected!')
@rpc(AnyXml, _returns=Unicode)
def exportGRID(ctx, payload):
try:
if not Ws2RabbitMQ.rabbit_connection.is_open:
print('RabbitMQ Connection lost - reconnecting...')
Ws2RabbitMQ.connectRabbit()
except Exception as e:
print('RabbitMQ Connection not found - initiating...')
Ws2RabbitMQ.connectRabbit()
Ws2RabbitMQ.rabbit_channel.basic_publish(
exchange='ws2rabbitmq', routing_key="blind", body=payload)
print(" [x] Sent")
return 'OK'
当我两次调用网络服务时,它起作用了。现在,Connection 仅创建一次并保存在 Singleton 属性 中。
这是脚本输出:
RabbitMQ Connection not found - initiating...
Rabbit connected!
[x] Sent
[x] Sent
我在 gunicorn 服务器 v19.9
上使用 python v3.5 和包 spyne 2.13 运行我用 python spyne 编写了一个小型 SOAP Web 服务(运行良好)。它接受一个字符串并将其排队到 rabbitmq。它不一定是rabbitmq,也可以是一个简单的DB insert oslt。现在它工作正常,但每次调用网络服务时,它
- 打开一个 rabbitmq 连接(如果你愿意,也可以打开一个数据库连接)
- 发送消息
- 再次关闭连接(?)
我想以某种方式保留某种 'instance variable' 的连接,并在每次调用 Webservice 时重新使用它。这样它只连接一次而不是每次我调用 ws.不幸的是,spyne 似乎没有创建任何对象,因此没有实例变量。
一般:使用 spyne 时如何保存状态(DB 或 RabbitMQ 连接)?
所以我用静态 class 属性尝试了这个 Trick,如下所示:
class Ws2RabbitMQ(ServiceBase):
rabbit_connection = pika.BlockingConnection(
pika.ConnectionParameters(host='localhost'))
rabbit_channel = rabbit_connection.channel()
@staticmethod
def connectRabbit():
rabbit_cred = pika.PlainCredentials(username='...', password='...')
Ws2RabbitMQ.rabbit_connection = pika.BlockingConnection(pika.ConnectionParameters(
host='...', virtual_host='...', credentials=rabbit_cred))
Ws2RabbitMQ.rabbit_channel = Ws2RabbitMQ.rabbit_connection.channel()
print('Rabbit connected!')
@rpc(AnyXml, _returns=Unicode)
def exportGRID(ctx, payload):
try:
if not Ws2RabbitMQ.rabbit_connection.is_open:
print('RabbitMQ Connection lost - reconnecting...')
Ws2RabbitMQ.connectRabbit()
except Exception as e:
print('RabbitMQ Connection not found - initiating...')
Ws2RabbitMQ.connectRabbit()
Ws2RabbitMQ.rabbit_channel.basic_publish(
exchange='ws2rabbitmq', routing_key="blind", body=payload)
print(" [x] Sent")
return 'OK'
当我两次调用网络服务时,它起作用了。现在,Connection 仅创建一次并保存在 Singleton 属性 中。
这是脚本输出:
RabbitMQ Connection not found - initiating...
Rabbit connected!
[x] Sent
[x] Sent