bugfix
This commit is contained in:
parent
db31437d7c
commit
accb61a398
108
uapi/uptask.py
Normal file
108
uapi/uptask.py
Normal file
@ -0,0 +1,108 @@
|
||||
import json
|
||||
from appPublic.log import debug, exception
|
||||
from appPublic.timeUtils import timestampstr
|
||||
from appPublic.registerfunction import RegisterFunction
|
||||
from appPublic.dictObject import DictObject
|
||||
import inspect
|
||||
from sqlor.dbpools import get_sor_context
|
||||
from ahserver.serverenv import ServerEnv
|
||||
|
||||
## 针对发起远端任务通过callback url 告知任务状态的逻辑
|
||||
async def uptask_started(taskid, userid, convert_func_name):
|
||||
"""
|
||||
taskid 任务id,唯一码
|
||||
convert_func_name: 响应数据转换函数,要完成数据校验,并将数据转换为正确的格式
|
||||
并返回status, resp_data
|
||||
status必须是:SUCCEEDED:成功, FAILED:失败, 其他状态可以不
|
||||
resp_resp 一个yaml格式的响应数据说明,这里只关注 状态(status)和识别码(idnentify_code)在返回数据中的字段名, 状态对照关系
|
||||
例子:
|
||||
```
|
||||
status:
|
||||
name: status
|
||||
mapping:
|
||||
failed: FAILED
|
||||
success: SUCCEEDED
|
||||
identify: identify
|
||||
identify_code 识别码字段名字
|
||||
```
|
||||
"""
|
||||
|
||||
env = ServerEnv()
|
||||
async with get_sor_context(env, 'longtasks') as sor:
|
||||
id = env.uuid()
|
||||
ns = {
|
||||
'id': id,
|
||||
'userid': userid,
|
||||
'executor_taskid': taskid,
|
||||
'convert_func_name': convert_func_name,
|
||||
'status': 'started',
|
||||
'start_timestamp': timestampstr()
|
||||
}
|
||||
d = await sor.C('uptask', ns)
|
||||
return id
|
||||
return None
|
||||
|
||||
async def uptask_feedback(task_id, resp_data):
|
||||
env = ServerEnv()
|
||||
async with get_sor_context(env, 'longtasks') as sor:
|
||||
recs = await sor.R('uptask', {'executor_taskid': task_id})
|
||||
if not recs:
|
||||
e = f'{task_id} not found'
|
||||
exception(e)
|
||||
raise Exception(e)
|
||||
lt = recs[0]
|
||||
if lt.status in ['SUCCEEDED', 'FAILED']:
|
||||
return
|
||||
|
||||
rf = RegisterFunction()
|
||||
resp = None
|
||||
f = rf.get(lt.convert_func_name)
|
||||
try:
|
||||
if inspect.iscoroutinefunction(f):
|
||||
resp = await f(resp_data)
|
||||
else:
|
||||
resp = f(resp_data)
|
||||
if resp is None:
|
||||
raise Exception(f'{task_id} {lt.convert_func_name}() return None')
|
||||
resp = DictObject(**resp)
|
||||
except Exception as e:
|
||||
e = f'{task_id}{e}'
|
||||
exception(e)
|
||||
raise Exception(e)
|
||||
|
||||
lt.status = resp.status
|
||||
if resp.status in ['SUCCEEDED', 'FAILED']:
|
||||
lt.response_data = json.dumps(resp, ensure_ascii=False)
|
||||
lt.end_timestamp = timestampstr()
|
||||
rf.delete(lt.convert_func_name)
|
||||
await sor.U('uptask', lt.copy())
|
||||
|
||||
async def get_my_uptasks(userid, biz_date):
|
||||
env = ServerEnv()
|
||||
begin = f'{biz_date} 00:00:00.000'
|
||||
end = f'{biz_date} 24:00:00.999
|
||||
sql = """select * from uptask
|
||||
where userid=${userid}
|
||||
and start_timestamp >= ${begin}$
|
||||
and start_timestamp ${end}$"""
|
||||
async with get_sor_context(env, 'longtasks') as sor:
|
||||
recs = await sor.R(sql, {'userid': userid, 'biz_date': biz_date})
|
||||
return recs
|
||||
return []
|
||||
|
||||
async def check_uptask_status(task_id):
|
||||
env = ServerEnv()
|
||||
async with get_sor_context(env, 'longtasks') as sor:
|
||||
recs = await sor.R('uptask', {'executor_taskid': task_id})
|
||||
if not recs:
|
||||
e = f'{task_id} not found'
|
||||
exception(e)
|
||||
raise Exception(e)
|
||||
lt = recs[0]
|
||||
if lt.status in ['SUCCEEDED', 'FAILED']:
|
||||
return DictObject(**json.loads(lt.response_data))
|
||||
|
||||
return DictObject(**{
|
||||
'status': lt.status
|
||||
})
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user