我正在使用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.
最终,工作人员似乎自然地设置为“脱机”,并且该任务确实超时并被移入下一个队列,如以下事件/描述所示:
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参数实现了此功能。
答案 0 :(得分:1)
这里是Twilio开发人员的传播者。
rejectedWorkers
不是由TaskRouter自动处理的属性。您引用this answer by my colleague Megan,其中她说:
例如,您可以更新TaskAttributes以使其具有拒绝的工作程序SID列表,然后在工作流中说worker.sid NOT IN task.rejectedWorkerSids。
因此,为了通过rejectedWorkers
属性进行过滤,您需要在拒绝保留之前由updating the task自己维护。
让我知道是否有帮助。