问:boto3的事件侦听器和自动确认

时间:2019-03-11 12:38:17

标签: python-3.x amazon-web-services boto3 amazon-mq elastic-mq

我当前正在创建一个微服务SQS轮询应用程序,该应用程序从(现在是弹性mq)接收JSON文件,然后通过程序运行它,然后将结果传播到另一个消息队列。 / p>

我现在编写的代码不是最佳实践代码,但是我无法确定如何通过文档正确编写侦听器,尽管我有一项使用Java中的AWS-SDK的服务(是一个python新手),它可以执行我想要的-事件侦听器,可自动确认收到的每条消息。

我目前有2个问题:我想使用boto3模块创建一个侦听器,该模块等待事件,当事件弹出时,它接收消息并自动确认-我想读取许多消息,但是当boto3与队列通信,此后不会删除它们。

当前发生的情况是:我有一个脚本,该脚本可以无限运行并发出接收调用,如果接收调用不是空列表,则它将清除消息队列并通过我们的程序运行它,然后传播处理后的消息。数据发送到另一个队列。

代码如下:应用程序本身。

class App(object):
def __init__(self):
    time.sleep(10)
    self.detector = FaceDetector()
    self.MQHandler = MQHandler()  # Todo - setup
    self.run()

"""
Restart the process
"""
def restart(self):
    self.detector = FaceDetector()
    self.run()

def run(self):
    #Receive from MQ -> stores data in paths variables.
    response = self.MQHandler.receive_from_feeder_service()

    ##Load files
    if len(response) > 0:
        paths = self.translate_JSON_to_list(response[0].body)
        fl = FileLoader(paths).get()
        ##Iterate files and run detection
        results = list(map(lambda f: self.detector.containsFace(f), fl))

        ##Send to MQ
        self.MQHandler.send_to_storage(self.translateToJSON(paths, results))

        ## restart process
        self.restart()
    else:
        self.restart()

消息队列

class MQHandler(object):
def __init__(self):
    self.endpoint = "http://mq:9324"
    self.region = "elasticmq"
    self.access_key = "x"
    self.secret_key = "x"
    self.feeder_queue = "imagePaths"
    self.storage_queue = "storage"

    self.resource = boto3.resource('sqs',
                                   endpoint_url=self.endpoint,
                                   region_name=self.region,
                                   aws_access_key_id=self.access_key,
                                   aws_secret_access_key=self.secret_key,
                                   use_ssl=False)


def receive_from_feeder_service(self):
    queue = self.resource.get_queue_by_name(QueueName=self.feeder_queue)
    receivedMessage = queue.receive_messages(WaitTimeSeconds=20)
    queue.purge()
    return receivedMessage

def send_to_storage(self, message):
    queue = self.resource.get_queue_by_name(QueueName=self.storage_queue)
    queue.send_message(MessageBody=message)

0 个答案:

没有答案