我当前正在创建一个微服务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)