Netflix Conductor Python客户端在创建任务时生成错误

问题描述

我尝试使用Netflix Conductor的Python客户端代码创建任务,但是无论如何称呼,我都会出错:

from conductor import conductor
import json

server_url = "http://localhost:8080/api"

task_def = '''[{
      "name": "verify_if_idents_are_added","retryCount": 3,"retryLogic": "FIXED","retryDelaySeconds": 10,"timeoutSeconds": 300,"timeoutPolicy": "TIME_OUT_WF","responseTimeoutSeconds": 180,"ownerEmail": "a@a.com"
    }]'''

metadataClient = conductor.MetadataClient(server_url)
metadataClient.registerTaskDef(task_def)
ERROR: {"status":400,"message":"Validation failed,check below errors for detail.","retryable":false,"validationErrors":[{"path":"updateTaskDef.arg0.ownerEmail","message":"ownerEmail cannot be empty"}]}
...

HTTPError: 400 Client Error: Bad Request for url: http://localhost:8080/api/metadata/taskdefs

也:

task_def_json = json.loads(task_def)
metadataClient.registerTaskDef(task_def_json)

获取:

ERROR: {"code":"INTERNAL_ERROR","message":"INTERNAL_ERROR - Cannot deserialize instance of `com.netflix.conductor.common.metadata.tasks.TaskDef` out of START_ARRAY token\n at [Source: (org.eclipse.jetty.server.HttpInputOverHTTP); line: 1,column: 1]","instance":"d4f36b3da428"}
...
HTTPError: 500 Server Error: Internal Server Error for url: http://localhost:8080/api/metadata/taskdefs

如何使用此Python模块创建任务?

解决方法

因为HTTP请求是如此简单,所以我建议使用请求直接发布,而不要使用可能没人使用的过时的python客户端。 这是一个DIY任务定义文章:

import requests

req_header={'Content-Type': 'application/json','Accept': 'application/json'}

task_def_endpoint='http://localhost:8080/api/metadata/taskdefs'
task_def = '''[{"name": "verify_if_idents_are_added","retryCount": 3,"retryLogic": "FIXED","retryDelaySeconds": 10,"timeoutSeconds": 300,"timeoutPolicy": "TIME_OUT_WF","responseTimeoutSeconds": 180,"ownerEmail": "a@a.com"}]'''

response= requests.post(task_def_endpoint,data=task_def,headers=req_header)
print(response.status_code)

现在,您可以跳过下面的其他信息并完成此操作,但是如果您感到好奇,请继续阅读。

如果您想知道Netflix python客户端随附的导体包是怎么回事,请查看https://github.com/Netflix/conductor/blob/master/client/python/conductor/conductor.py

您将看到MetadataClient的registerTaskDef()和updateTaskDef()实际上都在调用update或PUT端点,而不是create端点(POST端点)。假设您已经verify_if_idents_are_added 已在导体上定义,例如通过

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '[{"name": "verify_if_idents_are_added","ownerEmail": "a%40a.com"}]' 'http://localhost:8080/api/metadata/taskdefs'

您会发现以下代码有效(请注意,该任务不再位于List元素中,因为这正是PUT端点所期望的):

task_def = '''{"name": "verify_if_idents_are_added","ownerEmail": "a@a.com"}'''

metadataClient.registerTaskDef(task_def)

因此,我认为此客户端的registerTaskDef完全被抹黑了。您可以创建PR来对其进行修复,也可以仅使用requests来完成所需的工作。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...