java线程监听mq消息_基于多线程实现的接受MQ消息python脚本

这是一个Python脚本,用于通过多线程监听MQ消息。它使用qpid库连接到消息队列,从指定队列中接收消息,并使用ThreadPoolExecutor进行并发处理。每个接收到的消息会被转化为JSON并传递给处理函数,处理失败的情况会记录到日志文件。
摘要由CSDN通过智能技术生成

#!/usr/bin/env python#-*- coding: utf-8 -*-#===============================================================================#

#Copyright (c) 2015 Letv.com, Inc. All Rights Reserved#

#python2.6版本安装:#yum install python-futures#yum install python-qpid#yum install supervisor  由supervisor来管理进程,当进程挂掉后自动监控并重启#author: david#date: 2015/10/14 16:42:02#

#===============================================================================from qpid.messaging import *

import time, sys

import urllib2

import hashlib

import json

import traceback

from concurrent.futures import *

import logging

import logging.handlers

LOG_DIR = "/home/ldw/logs/geturl/online"

LOG_MID_FAIL=LOG_DIR + "/update_fail.log"

LOG_FILE_NAME=LOG_DIR + "/geturl_update.log"

#default test brokerQPID_QUEUE_NAME_TEST = "ldw.update_v.queue"

SERVERS_TEST = ['10.3.3.3']

SERVERS_PRO = ['10.1.1.1.', '10.2.2.2']

BROKER_TEST = "xyz/xyz@10.11.1.1:5672"

BROKER_PRO = "xyz/xyz@10.11.1.2:5672"

RECONNECTION_URLS = ['']

SERVERS = SERVERS_TEST

BROKER = BROKER_TEST

QUEUE_NAME = QPID_QUEUE_NAME_TEST

THREAD_COUNT = 16

#获取当前时间def getNowTime():

ISOTIMEFORMAT='%Y-%m-%d %H:%M:%S'

return time.strftime(ISOTIMEFORMAT, time.localtime())

#记录处理失败日志def fail2log(id):

#使用with关键字,自动关闭文件流    with  open(LOG_MID_FAIL,'a') as log:

log.write('%s\n'%(id))

#记录日志, 可以提出来共用def init_logger():

logging.basicConfig()

logger = logging.getLogger("__name__")

logger.setLevel(logging.INFO)

#when:S:Seconds M:Minutes D:Days H:Hours interval:  backupCount:0 not deleted# 1天更换一次文件日志,7为保留日志文件个数    logger_fh = logging.handlers.TimedRotatingFileHandler(LOG_FILE_NAME, 'D', 1, 7)

logger_fh.suffix = "%Y%m%d-%H%M.log"

logger_fh.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))

logger.addHandler(logger_fh)

return logger

_logger = init_logger()

#初始化环境变量,当在局部函数中修改全局变量时,使用global关键字def init_env(env):

global BROKER

#其他变量类似处理    if env != 'PRO':

BROKER = BROKER_PRO

_logger.info('env:%s,broker:%s,queue_name:%s,reconnnection_urls:%s, servers: %s, thread_pool_count:%s'

% (env,BROKER,QUEUE_NAME,str(RECONNECTION_URLS),str(SERVERS), str(THREAD_COUNT)))

#处理业务逻辑def process(id, ip):

key = 'xyz';

action = 'delete';

tm = str(int(time.time()))

sig = hashlib.md5(tm+action+key).hexdigest()

url = "http://ip/test?sig="+sig

try:

req = urllib2.Request(url)

#绑定Host        #req.add_header('Host', 'www.ldw.com')        response = urllib2.urlopen(req, timeout = 1)

result = response.read()

if result.find("400")>=0:

fail2log(id)

_logger.error('flush cache fail, url :%s' % (url))

else:

_logger.info('flush cache OK, IP :%s' % (ip))

except Exception:

fail2log(id)

_logger.error('flush cbase cache error, url: %s' % (url))

#init qpid connectiondef qpid_get_conn():

conn = Connection(BROKER, heartbeat=6, reconnect=True, reconnect_limit=60, reconnect_interval=4, reconnect_urls=RECONNECTION_URLS)

conn.open()

sess = conn.session()

rec = sess.receiver(QUEUE_NAME)

return conn, sess, rec

#receive message of qpid queue, multithread implementsdef qpid_receive(rec):

try:

epool = ThreadPoolExecutor(max_workers=THREAD_COUNT)

while True:

try:

message = rec.fetch()

data = json.loads(message.content)

_logger.info('receive message:%s' % (message.content))

mid = data['mid']

for ip in SERVERS:

try:

epool.submit(process(mid, ip))

except Exception,e:

pass

fail2log(mid)

exstr = traceback.format_exc()

_logger.error('thread pool process message error:%s' % (exstr))

except Exception, e:

pass

fail2log(mid)

_logger.error('fetch message error, msg:%s' % (message.content))

sess.acknowledge() #message ack    except Exception, e:

pass

exstr = traceback.format_exc()

_logger.error('start receive message error:%s' % (exstr))

if __name__ ==   '__main__':

if(len(sys.argv) 

print "Usage: \"python input args error\""

sys.exit()

env = sys.argv[1]

if env != 'TEST' and env != 'PRO':

print "Usage: \"input evn args error\""

sys.exit()

try:

init_env(env)

conn, sess, rec =  qpid_get_conn()

qpid_receive(rec)

for c in [ conn, sess, rec]:

if c: c.close()

except Exception, e:

pass

exstr = traceback.format_exc()

_logger.error('init qpid connection message error:%s' % (exstr))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值