Twilio Taskrouter:如何防止队列中的最后一个工人被重新分配被拒绝的任务?
Twilio Taskrouter: How to prevent last worker in queue from being reassigned rejected task?
我正在使用 NodeJS 来管理 Twilio Taskrouter 工作流程。我的目标是将任务分配给标识为 queueSid
的主队列中的空闲工作人员,除非满足以下条件之一:
队列中没有工人被设置为空闲
任务的预订已被队列中的每个工作人员拒绝
在这些情况下,任务应该进入下一个用 automaticQueueSid
标识的队列。以下是我为工作流构建 JSON 的方式(它包括一个过滤器,这样来自代理的入站调用不应生成对同一代理的出站调用):
configurationJSON(){
var config={
"task_routing":{
"filters":[
{
"filter_friendly_name":"don't call self",
"expression":"1==1",
"targets":[
{
"queue":queueSid,
"expression":"(task.caller!=worker.contact_uri) and (worker.sid NOT IN task.rejectedWorkers)",
"skip_if": "workers.available == 0"
},
{
"queue":automaticQueueSid
}
]
}
],
"default_filter":{
"queue":queueSid
}
}
}
return config;
}
这会导致在任务到达队列后不会创建预留。我的事件记录器显示发生了以下事件:
workflow.target-matched
workflow.entered
task.created
到此为止,就挂在那里了。当我更换线
"expression":"(task.caller!=worker.contact_uri) and (worker.sid NOT IN task.rejectedWorkers)"
和
"expression":"(task.caller!=worker.contact_uri)
然后为下一个可用的工作人员正确创建预订,或者如果来电时没有工作人员可用,则将预订发送给 automaticQueueSid
,所以我猜 skip_if
工作正常。所以也许我写目标表达式的方式有问题?
我尝试通过在工作人员拒绝预订后将其设置为不可用来解决此问题,如下所示:
clientWorkspace
.workers(parameters.workerSid)
.reservations(parameters.reservationSid)
.update({
reservationStatus:'rejected'
})
.then(reservation=>{
//this function sets the worker's Activity to Offline
var updateResult=worker.updateWorkerFromSid(parameters.workerSid,process.env.TWILIO_OFFLINE_SID);
})
.catch(err=>console.log("/agent_rejects: error rejecting reservation: "+err));
但似乎正在发生的事情是,一旦预订被拒绝,在调用 worker.updateWorkerFromSid()
之前,Taskrouter 已经生成了一个新的预订并将其分配给同一个工作人员,而我的 Activity 更新失败,出现以下错误:
Error: Worker [workerSid] cannot have its activity updated while it has 1 pending reservations.
最终,似乎工作人员自然地设置为 Offline,并且任务确实超时并移至下一个队列,如下所示 events/descriptions:
worker.activity.update
Worker [friendly name] updated to Offline Activity
reservation.timeout
Reservation [sid] timed out
task-queue.moved
Task [sid] moved out of TaskQueue [friendly name]
task-queue.timeout
Task [sid] timed out of TaskQueue [friendly name]
在这一点之后,任务被移动到下一个队列 automaticQueueSid
以由在该队列中注册的可用工作人员处理。我不确定为什么要使用超时,因为我没有在我的工作流配置中包含超时。
我很纳闷--在最后一个工人的预订被拒绝后,如何让任务成功移动到下一个队列?
更新:尽管@philnash 的回答帮助我正确处理了 worker.sid NOT IN task.rejectedWorkers
问题,但我最终在更新工作人员的可用性时使用 RejectPendingReservations 参数实现了此功能。
这里是 Twilio 开发人员布道者。
rejectedWorkers
不是 TaskRouter 自动处理的属性。您引用了 this answer by my colleague Megan,其中她说:
For example, you could update TaskAttributes to have a rejected worker SID list, and then in the workflow say that worker.sid NOT IN task.rejectedWorkerSids.
因此,为了按 rejectedWorkers
属性进行过滤,您需要自己维护一个属性,在拒绝预订之前按 updating the task。
如果有帮助请告诉我。
我正在使用 NodeJS 来管理 Twilio Taskrouter 工作流程。我的目标是将任务分配给标识为 queueSid
的主队列中的空闲工作人员,除非满足以下条件之一:
队列中没有工人被设置为空闲
任务的预订已被队列中的每个工作人员拒绝
在这些情况下,任务应该进入下一个用 automaticQueueSid
标识的队列。以下是我为工作流构建 JSON 的方式(它包括一个过滤器,这样来自代理的入站调用不应生成对同一代理的出站调用):
configurationJSON(){
var config={
"task_routing":{
"filters":[
{
"filter_friendly_name":"don't call self",
"expression":"1==1",
"targets":[
{
"queue":queueSid,
"expression":"(task.caller!=worker.contact_uri) and (worker.sid NOT IN task.rejectedWorkers)",
"skip_if": "workers.available == 0"
},
{
"queue":automaticQueueSid
}
]
}
],
"default_filter":{
"queue":queueSid
}
}
}
return config;
}
这会导致在任务到达队列后不会创建预留。我的事件记录器显示发生了以下事件:
workflow.target-matched
workflow.entered
task.created
到此为止,就挂在那里了。当我更换线
"expression":"(task.caller!=worker.contact_uri) and (worker.sid NOT IN task.rejectedWorkers)"
和
"expression":"(task.caller!=worker.contact_uri)
然后为下一个可用的工作人员正确创建预订,或者如果来电时没有工作人员可用,则将预订发送给 automaticQueueSid
,所以我猜 skip_if
工作正常。所以也许我写目标表达式的方式有问题?
我尝试通过在工作人员拒绝预订后将其设置为不可用来解决此问题,如下所示:
clientWorkspace
.workers(parameters.workerSid)
.reservations(parameters.reservationSid)
.update({
reservationStatus:'rejected'
})
.then(reservation=>{
//this function sets the worker's Activity to Offline
var updateResult=worker.updateWorkerFromSid(parameters.workerSid,process.env.TWILIO_OFFLINE_SID);
})
.catch(err=>console.log("/agent_rejects: error rejecting reservation: "+err));
但似乎正在发生的事情是,一旦预订被拒绝,在调用 worker.updateWorkerFromSid()
之前,Taskrouter 已经生成了一个新的预订并将其分配给同一个工作人员,而我的 Activity 更新失败,出现以下错误:
Error: Worker [workerSid] cannot have its activity updated while it has 1 pending reservations.
最终,似乎工作人员自然地设置为 Offline,并且任务确实超时并移至下一个队列,如下所示 events/descriptions:
worker.activity.update
Worker [friendly name] updated to Offline Activity
reservation.timeout
Reservation [sid] timed out
task-queue.moved
Task [sid] moved out of TaskQueue [friendly name]
task-queue.timeout
Task [sid] timed out of TaskQueue [friendly name]
在这一点之后,任务被移动到下一个队列 automaticQueueSid
以由在该队列中注册的可用工作人员处理。我不确定为什么要使用超时,因为我没有在我的工作流配置中包含超时。
我很纳闷--在最后一个工人的预订被拒绝后,如何让任务成功移动到下一个队列?
更新:尽管@philnash 的回答帮助我正确处理了 worker.sid NOT IN task.rejectedWorkers
问题,但我最终在更新工作人员的可用性时使用 RejectPendingReservations 参数实现了此功能。
这里是 Twilio 开发人员布道者。
rejectedWorkers
不是 TaskRouter 自动处理的属性。您引用了 this answer by my colleague Megan,其中她说:
For example, you could update TaskAttributes to have a rejected worker SID list, and then in the workflow say that worker.sid NOT IN task.rejectedWorkerSids.
因此,为了按 rejectedWorkers
属性进行过滤,您需要自己维护一个属性,在拒绝预订之前按 updating the task。
如果有帮助请告诉我。