【问题标题】:Preservice a state in python spyne (like a db connection)在 python spyne 中为状态提供服务(如数据库连接)
【发布时间】:2019-08-26 11:41:59
【问题描述】:

我正在使用 python v3.5 和包 spyne 2.13 在 gunicorn 服务器 v19.9 上运行

我用 python spyne 写了一个小的 SOAP Webservice(运行良好)。它需要一个字符串并将其排入rabbitmq。不一定是rabbitmq,也可以是简单的DB insert oslt。现在它工作正常,但每次调用 web 服务时,它都

  • 打开一个 rabbitmq 连接(如果你愿意,也可以打开一个 DB 连接)
  • 发送消息
  • 再次关闭连接(?)

我想以某种方式将连接保留在某种“实例变量”中,并在每次调用 Web 服务时重新使用它。所以它只连接一次,而不是每次我打电话给ws。不幸的是 spyne 似乎没有创建任何对象,所以没有实例变量。

一般情况下:我如何在使用 spyne 时保留状态(DB 或 RabbitMQ 连接)?

【问题讨论】:

    标签: python database rabbitmq state spyne


    【解决方案1】:

    所以我尝试了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'
    

    当我两次调用网络服务时,它可以工作。现在,仅创建一次连接并保存在 Singleton 属性中。

    这是脚本输出:

    RabbitMQ Connection not found - initiating...
    Rabbit connected!
     [x] Sent
     [x] Sent
    

    【讨论】:

    • 顺便说一句:我忘了说,我的 web 服务位于 haproxy 后面。无论出于何种原因,属性 pika connection.is_open 都无法正常工作。当rabbit关闭连接时,pika在这里仍然返回true。当直接连接到rabbitmq(没有haproxy)时,它工作正常。似乎是一个已知问题,但是 -> 我不在乎 :)
    • 维护连接池通常是高级客户端库的工作。参见例如。 txpostgres。请注意,库提供的连接池看起来与您的解决方案没有太大不同。您可能需要对竞争条件采取预防措施,这可能会使您有两个打开的连接而不是一个,并且可能将 try/except 块中的代码移动到另一个函数中,但仅此而已。
    • 另请注意,ctx.service_class 允许您访问服务类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 2016-09-13
    相关资源
    最近更新 更多