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?
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. –
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. –