2017-03-31 1 views
0

J'essaie d'intégrer un consommateur pika (RabbitMQ) à base torsadée dans un service. Voici les bits pertinents de ce que j'ai mis en place actuellement:Conversion d'un consommateur tordu en un service

worker.py

import pika 
from pika.adapters import twisted_connection 
from twisted.internet import defer, reactor, protocol, task 

@defer.inlineCallbacks 
def run(connection): 
    channel = yield connection.channel() 
    yield channel.queue_declare(
     queue='event_queue', 
     durable=True, auto_delete=False, exclusive=False 
    ) 
    queue_object, consumer_tag = yield channel.basic_consume(
     queue='event_queue', no_ack=False 
    ) 
    l = task.LoopingCall(process, queue_object, connection) 
    l.start(0.01) 

@defer.inlineCallbacks 
def process(queue_object, connection): 
    ch, method, properties, body = yield queue_object.get() 
    if body: 
     print "Do stuff here" 
    yield ch.basic_ack(delivery_tag=method.delivery_tag) 

def start(): 
    parameters = pika.ConnectionParameters() 
    cc = protocol.ClientCreator(
     reactor, twisted_connection.TwistedProtocolConnection, parameters 
    ) 
    d = cc.connectTCP(MQ_SERVER, MQ_SERVER_PORT) 
    d.addCallback(lambda x: x.ready) 
    d.addCallback(run) 

Ce travailleur fonctionne très bien lorsqu'il est exécuté en utilisant le script suivant:

runserver.py

import worker 
from twisted.internet import reactor 

if __name__ == '__main__': 
    worker.start() 
    reactor.run() 

Je ne vois pas à comprendre comment obtenir ce travail avec ot ses Services dans un fichier .tac.

services.tac

from twisted.application import service 
application = service.Application("An application") 


from other import get_service 
other_service = get_service() 
other_service.setServiceParent(application) 

import worker 
worker.start() 

Ce fichier tac ne fonctionne pas quand il est exécuté. Le même code sans autre service semble fonctionner, mais il ne semble pas fonctionner quand d'autres services sont activés. Au lieu de cela, il renvoie un délai différé.

Y a-t-il un moyen de transformer ce truc connectTCP qui prend deffereds dans un service régulier?

Répondre

0

vous devez exécuter un fichier .tac avec twistd:

$ twistd -ny services.tac 
+0

Oui, je le faire. Eh bien, systemd exécute un script qui exécute twistd -ny services.tac. Cela fonctionne quand il y a seulement un de ces services de type connectTCP seul, ou quand il y a un certain nombre d'autres services bien définis basés sur TCPServer (à partir d'un standard torsadé ou basé sur des bibliothèques similaires). Il casse quand j'essaie de les mettre dans le même .tac. –

+0

Un exemple complet est souvent requis avant que quiconque puisse comprendre la situation et fournir une réponse correcte. Envisagez d'ajouter toutes les informations manquantes sur ce que vous faites à votre question. –