I am trying to process messages got from rabbitmq and store it to MongoDB using mongoengine package. But When I try to initialize instance of Document object from mongoengine process is hanging and not returning any result.
Here is my main.py.
import os
import sys
from mongoengine import connect, disconnect
from mongoengine.connection import ConnectionFailure
from rabbitmq_client import RabbitMqClient
def main():
connection = connect(host=MONGO_HOST, alias='raw-keyword-result') # establish mongodb connection
print("connection->", connection)
settings = tracking_job_settings(os.environ)
rbmq = RabbitMqClient(settings)
rbmq.start_consuming(result_handler)
print("not here")
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
print('Interrupted')
disconnect(alias='raw-keyword-result')
try:
sys.exit(0)
except SystemExit:
os._exit(0)
except ConnectionFailure as e:
print("error")
print(e)
I am getting messages from RabbitMQ smoothly but I am not sure the database connection still exists when callback function result_handler called. result_handler function.
def result_handler(ch, method, properties, body):
data = json.loads(body)
# TODO before processing the job, verify its existance in the database
job_type = data['header']['jobType']
try:
if job_type == 'DetailResult':
handle_detail_result(data)
elif job_type == 'KeywordResult':
handle_keyword_result(data)
print("yeyeyeye")
ch.basic_ack(delivery_tag=method.delivery_tag) # TODO acknowledging job here is unsecure !!!
except:
pass
From here handle_keyword_result function is called with RabbitMQ message. Here is the handle_keyword_result function:
from datetime import datetime
from mongoengine.errors import ValidationError
from orm import TrackingRawKeyword
def handle_keyword_result(message):
"""
"""
entries = []
results = message['data']['results']
ranking = 0
print("keyword_result")
for result in results:
ranking += 1
print("result->", result)
# try:
print("start")
entry = TrackingRawKeyword(
ranking=ranking,
date=datetime.now(),
marketplace=message['header']['marketplace'],
keyword=message['data']['keyword'],
marketplaceId=result['marketId']
)
print("end")
print("entry->", entry)
entries.append(entry)
# except ValidationError as ve:
# print("error happened")
# print(ve)
# pass # TODO handle validation error for data entry.
print("entries->", entries)
TrackingRawKeyword.objects.insert(entries)
Here is Document object TrackingRawKeyword
class TrackingRawKeyword(Document):
marketplaceId = StringField(required=True)
market = StringField(choices=marketplaces, max_length=20, required=True)
keyword = StringField(max_length=1024, required=True)
ranking = IntField(required=True)
date = DateTimeField()
When I run main.py file my program connects to RabbitMQ and also MongoDb, it receives messages from RabbitMQ and calls handlers. But in keyword_result_handler function, only process goes until print("start"). It does not continue after it. It hangs there.