Twilio Taskrouter:如何防止队列中的最后一个工作人员被重新分配被拒绝的任务?

时间:2019-03-27 16:00:13

标签: node.js twilio twilio-taskrouter

我正在使用NodeJS来管理Twilio Taskrouter工作流。我的目标是在主队列中用queueSid标识一个分配给空闲工作程序的任务,除非满足以下条件之一:

  1. 队列中没有任何工人设置为空闲

  2. 队列中的每个工作人员已经拒绝了任务的预订

在这些情况下,任务应该进入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参数实现了此功能。

1 个答案:

答案 0 :(得分:1)

这里是Twilio开发人员的传播者。

rejectedWorkers不是由TaskRouter自动处理的属性。您引用this answer by my colleague Megan,其中她说:

  

例如,您可以更新TaskAttributes以使其具有拒绝的工作程序SID列表,然后在工作流中说worker.sid NOT IN task.rejectedWorkerSids。

因此,为了通过rejectedWorkers属性进行过滤,您需要在拒绝保留之前由updating the task自己维护。

让我知道是否有帮助。