2017-03-31 7 views
0

Ich versuche, einen twisted-basierten Pika (RabbitMQ) Verbraucher in einen Dienst zu bekommen. Hier die entsprechenden Bits von dem, was ich zur Zeit in Kraft gesetzt habe:Umwandlung eines verdrillten Verbrauchers in einen Dienst

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) 

Dieser Arbeiter funktioniert gut, wenn mit dem folgende Skript ausführen:

runserver.py

import worker 
from twisted.internet import reactor 

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

ich kann nicht, um herauszufinden, wie diese mit ot zur Arbeit kommen ihre Dienste in einer .tac-Datei.

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() 

Diese tac-Datei funktioniert nicht, wenn es ausgeführt wird. Der gleiche Code ohne anderen Dienst scheint zu funktionieren, aber es scheint nicht zu funktionieren, wenn andere Dienste aktiviert sind. Stattdessen gibt es eine verzögerte Zeit zurück.

Gibt es eine Möglichkeit, dass ich diese connectTCP-Sache machen kann, die deffereds in einen regelmäßigen Dienst aufnimmt?

Antwort

0

Sie haben eine .tac Datei mit Twistd auszuführen:

$ twistd -ny services.tac 
+0

Ja, ich das tun. Nun, Systemd führt ein Skript aus, das twistd -ny services.tac ausführt. Es funktioniert, wenn es nur einen dieser Dienste vom Typ connectTCP gibt, oder wenn es eine beliebige Anzahl anderer TCPServer-basierter, wohldefinierter Dienste gibt (aus verdrehten Standards oder basierend auf ähnlichen Bibliotheken). Es bricht, wenn ich versuche, sie in die gleiche .tac zu bringen. –

+0

Oft ist ein vollständiges Beispiel erforderlich, bevor jemand die Situation verstehen und eine korrekte Antwort geben kann. Erwägen Sie, alle fehlenden Informationen zu Ihrer Frage hinzuzufügen. –

Verwandte Themen