139 lines
6.7 KiB
Python
139 lines
6.7 KiB
Python
# coding=utf-8
|
||
# 用于MQ的各类操作
|
||
import time
|
||
import os
|
||
|
||
from base_framework.public_business.common.UBRD.kw.promotion_keyword import obj_log
|
||
from base_framework.public_tools.read_config import ReadConfig, get_current_env, get_current_config
|
||
from base_framework.public_tools.runner import Runner
|
||
from base_framework.public_tools.custom_error import BusinessError
|
||
obj_runner = Runner()
|
||
|
||
|
||
class RocketMQ:
|
||
|
||
def __init__(self, env=''):
|
||
self.need_login = True # 是否需要登录
|
||
self.team = get_current_config(section="run_evn_name", key="current_team")
|
||
if not env:
|
||
env = get_current_env().lower()
|
||
if env.lower() == 'sim':
|
||
if self.team in ['XUEDAU']:
|
||
self.mq_host = ""
|
||
self.need_login = False
|
||
else:
|
||
self.mq_host = "https://mq-console.sim.huohua.cn"
|
||
else:
|
||
if self.team in ['XUEDAU']:
|
||
self.mq_host = "http://10.250.200.3:19876"
|
||
self.need_login = False
|
||
else:
|
||
self.mq_host = "https://mq-console.qa.huohua.cn"
|
||
|
||
def mq_query_msg_info(self, topic, begin_time, end_time):
|
||
"""查询mq消息"""
|
||
msg_id_list = self.__query_msg_id_list(topic=topic, begin_time=begin_time, end_time=end_time)
|
||
msg_info = []
|
||
for msg_id in msg_id_list:
|
||
m_info = self.__query_msg_detail_by_id(topic=topic, msg_id=msg_id)
|
||
msg_info.append(m_info)
|
||
return msg_info
|
||
|
||
def mq_query_msg_info_by_sub_str(self, topic, begin_time, end_time, sub_str=None):
|
||
"""查询mq消息,并返回匹配的消息内容"""
|
||
msg_info = self.mq_query_msg_info(topic=topic, begin_time=begin_time, end_time=end_time)
|
||
if sub_str:
|
||
sub_msg = []
|
||
for msg in msg_info:
|
||
if str(sub_str) in str(msg["msg_body"]):
|
||
sub_msg.append(msg)
|
||
return sub_msg
|
||
else:
|
||
return msg_info
|
||
|
||
def __query_msg_id_list(self, topic, begin_time, end_time):
|
||
"""查询mq的id列表"""
|
||
mq_url = "{}/message/queryMessageByTopic.query".format(self.mq_host)
|
||
post_data = {"topic": topic,
|
||
"begin": str(time.mktime(time.strptime(str(begin_time), '%Y-%m-%d %H:%M'))).split('.')[0] + '000',
|
||
"end": str(time.mktime(time.strptime(str(end_time), '%Y-%m-%d %H:%M'))).split('.')[0] + '000'}
|
||
if self.need_login:
|
||
resp = obj_runner.call_rest_api(user=None, API_URL=mq_url, req_type="GET", params=post_data)
|
||
else:
|
||
resp = obj_runner.call_rest_api(user=None, API_URL=mq_url, req_type="GET", token=False, params=post_data)
|
||
if resp['status'] == 0:
|
||
msg_id_list = []
|
||
for item in resp['data']:
|
||
msg_id_list.append(item['msgId'])
|
||
return msg_id_list
|
||
else:
|
||
raise Exception("查询MQ消息列表失败:{}".format(resp))
|
||
|
||
def __query_msg_detail_by_id(self, topic, msg_id):
|
||
"""查询mq消息明细"""
|
||
mq_url = "{}/message/viewMessage.query".format(self.mq_host)
|
||
post_data = {"topic": topic, "msgId": msg_id}
|
||
if self.need_login:
|
||
resp = obj_runner.call_rest_api(user=None, API_URL=mq_url, req_type="GET", params=post_data)
|
||
else:
|
||
resp = obj_runner.call_rest_api(user=None, API_URL=mq_url, req_type="GET", token=False, params=post_data)
|
||
if resp['status'] == 0:
|
||
msg_tag = resp['data']['messageView']['properties'].get('TAGS', None)
|
||
msg_key = resp['data']['messageView']['properties'].get('KEYS', None)
|
||
msg_env = resp['data']['messageView']['properties'].get('podenv', None)
|
||
msg_body = resp['data']['messageView'].get('messageBody', None)
|
||
return {"msg_id": msg_id, "msg_tag": msg_tag, "msg_key": msg_key, "msg_env": msg_env, "msg_body": msg_body}
|
||
else:
|
||
raise Exception("查询MQ消息明细失败:{}".format(resp))
|
||
|
||
def mq_send_msg(self, topic, message_body, tag=None, key=None, pro=None, **kwargs):
|
||
"""mq消息发送"""
|
||
mq_url = "{}/topic/sendTopicMessage.do".format(self.mq_host)
|
||
post_data = {'topic': topic,
|
||
'tag': tag,
|
||
'key': key,
|
||
'messageBody': str(message_body).replace("'", "\"")
|
||
}
|
||
if not pro:
|
||
# 添加启动文件中的独立环境编号
|
||
cfg_path = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
|
||
ini_path = cfg_path + '/base_framework/base_config/env_choose.ini'
|
||
jira_id = ReadConfig(ini_path).get_value(sections='run_jira_id', options='huohua-podenv')
|
||
if jira_id:
|
||
post_data['pro'] = jira_id
|
||
else:
|
||
post_data['pro'] = 'qa'
|
||
else:
|
||
post_data['pro'] = pro
|
||
|
||
if self.team.lower() == "xuedau":
|
||
resp = obj_runner.call_rest_api(user=None, API_URL=mq_url, req_type="POST", json=post_data, **kwargs)
|
||
else:
|
||
resp = obj_runner.call_rest_api(user=None, API_URL=mq_url, req_type="POST", json=post_data)
|
||
|
||
try:
|
||
obj_log.info("发送mq消息返回:{}".format(resp))
|
||
if resp and 'errMsg' in resp and 'timeout' in str(resp['errMsg']):
|
||
time.sleep(1) # 如果接口返回超时,就再发送一次
|
||
resp = obj_runner.call_rest_api(user=None, API_URL=mq_url, req_type="POST", json=post_data)
|
||
elif resp and 'message' in resp and '无效的token' in str(resp['message']):
|
||
time.sleep(1) # 如果token过期,就再发送一次
|
||
resp = obj_runner.call_rest_api(user=None, API_URL=mq_url, req_type="POST", json=post_data)
|
||
elif resp and resp['status'] == 0 and resp['data']['sendStatus'] == 'SEND_OK':
|
||
return True
|
||
else:
|
||
raise Exception("发送mq消息失败:{}".format(resp))
|
||
except Exception as e:
|
||
obj_log.info("发送mq消息体:{}".format(post_data))
|
||
raise Exception("发送mq消息失败:{}|{}".format(e, resp))
|
||
|
||
|
||
if __name__ == '__main__':
|
||
|
||
mq = RocketMQ()
|
||
mb = {"platformId": 2, "eventType": "user.join", "roleType": 200, "roleId": 48711, "appId": "", "source": "SparkEnglish", "classroomCode": "", "classroomType": 1, "scheduleCode": "ECR666358307917090884", "joinTime": 1747189786903, "classSizeType": 1, "isFirst": "", "subChannelCodeList": "", "deviceId": "20200830-9CFC-E8BE-8D68-9CFCE8BE8D6C", "classroomVersion": "25.5.3-qa.2212381", "appVersion": "25.4.7-stable.2172220"}
|
||
rsp = mq.mq_send_msg(topic='CP_CLASSROOM_STATUS_SYNC', message_body=mb, tag='TAG_ROLE_JOIN_TIME', pro='QA', xuedau="")
|
||
print(rsp)
|
||
|
||
|