我正在尝试创建一个Cloud Tasks队列,该任务在HTTP任务失败时永远不会重试。
根据documentation,maxAttempts应该是我要寻找的:
每个任务的尝试次数。
Cloud Tasks将尝试任务maxAttempts次(即,如果 第一次尝试失败,然后将出现maxAttempts-1次重试)。必须 是> = -1。
因此,如果maxAttempts为1,则应重试0次。
但是,例如,如果我跑步
gcloud tasks queues create test-queue --max-attempts=1 --log-sampling-ratio=1.0
然后使用以下Python代码创建HTTP任务:
from google.cloud import tasks_v2beta3
from google.protobuf import timestamp_pb2
client = tasks_v2beta3.CloudTasksClient()
project = 'project_id' # replace by real project ID
queue = 'test-queue'
location = 'us-central1'
url = 'https://example.com/task_handler' # replace by some endpoint that return 5xx status code
parent = client.queue_path(project, location, queue)
task = {
'http_request': { # Specify the type of request.
'http_method': 'POST',
'url': url # The full url path that the task will be sent to.
}
}
response = client.create_task(parent, task)
print('Created task {}'.format(response.name))
在队列的Stackdriver日志中(由于我在创建队列时使用了--log-sampling-ratio=1.0
,因此可以看到它),该任务显然被重试了一次:一次调度尝试,然后是状态为UNAVAILABLE的调度响应,然后是另一次调度尝试,最后是最后一个调度响应(也表示“不可用”)。
有什么办法可以重试0次?
注意
关于maxAttempts,文档还显示:
此字段的含义与queue.yaml / xml中的task_retry_limit相同。
但是,当我进入description for task_retry_limit时,它说:
重试次数。例如,如果指定0且任务 失败,则根本不会重试该任务。如果指定1并且任务 失败,任务将重试一次。如果未指定此参数,则 任务将无限期重试。如果将task_retry_limit指定为 task_age_limit,直到重试两个任务为止。
这似乎与maxAttempts的描述不一致,因为它表明如果参数为1,则将重试一次任务。
我尝试将maxAttempts设置为0,但这似乎使它假定默认值为100。
谢谢。
答案 0 :(得分:1)
正如@ averi-kitsch所提到的,这是当前内部问题,我们的Cloud Tasks工程师团队目前正在处理此问题,可惜我们还没有任何ETA。
您可以使用此Public Issue Tracker跟踪此问题的进展,单击“星号”以订阅它并接收以后的更新。
作为一种变通方法,如果您不希望任务失败后重试,请直接在queue.yaml上设置“ task_retry_limit = 0 ”。
示例:
Container(
alignment: Alignment.centerLeft,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10.0),
boxShadow: [
BoxShadow(
color: Colors.black12,
blurRadius: 6.0,
offset: Offset(0, 2),
),
],
),
height: 60.0,
child: DropdownButtonFormField(
decoration: InputDecoration(
border: InputBorder.none,
prefixIcon: Icon(
Icons.location_city,
color: Colors.black,
)
),
items: states.map((String dropDownStringItem) {
return DropdownMenuItem<String>(
value: dropDownStringItem,
child: Text(dropDownStringItem),
);
}).toList(),
onChanged: (value) {
setState(() {
print(value);
});
},
),
),