【问题标题】:Twilio Taskrouter: How to prevent last worker in queue from being reassigned rejected task?Twilio Taskrouter:如何防止队列中的最后一个工作人员被重新分配拒绝任务?
【发布时间】:2019-03-27 16:00:13
【问题描述】:

我正在使用 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 已经生成了一个新的预订并将其分配给同一个工作人员,我的活动更新失败并出现以下错误:

Error: Worker [workerSid] cannot have its activity updated while it has 1 pending reservations.

最终,worker 似乎自然地设置为 Offline 并且任务确实超时并被移动到下一个队列中,如以下事件/描述所示:

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 参数实现了此功能。

【问题讨论】:

  • 您是否将工作人员的 SID 添加到任务的 rejectedWorkers 属性中?
  • @philnash 不,我根据this answer 假设它是作为 Taskrouter 内部操作的一部分进行更新的。

标签: node.js twilio twilio-taskrouter


【解决方案1】:

这里是 Twilio 开发者宣传员。

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

例如,您可以更新 TaskAttributes 以获得拒绝的工作人员 SID 列表,然后在工作流中说 worker.sid NOT IN task.rejectedWorkerSids。

因此,为了按rejectedWorkers 属性进行过滤,您需要自己维护一个,在您拒绝预订之前按updating the task

让我知道这是否有帮助。

【讨论】:

  • 好的,我想我明白了——Megan 的回答是关于 Target Workers Expression 在一般运输中作为一项新功能,而不是 TaskAttributes 中的内置 rejectedWorkers 属性。我会自己添加这个,看看我能不能让它工作。
  • 好的,你已经找到了。没有内置的 Task 属性,您必须在它们发生时添加自己的属性。
  • 快速问题:要使用拒绝工作人员的 workerSid 更新任务属性,似乎我必须对workspace.tasks(taskSid) 进行两次调用:一次获取任务的任务属性,然后我复制一个本地TaskAttributes 对象的版本,然后使用添加的 workerSid 更新它,然后第二次调用 workspace.tasks(taskSid).update() 以将更新的 TaskAttributes 对象分配回任务。有没有办法通过调用workspace.tasks(taskSid).update() 来实现相同的结果?
  • 嗨,Phil,我有一个问题,如果在一个步骤中分配了多个工作人员,如果多个工作人员同时拒绝分配,更新数组 deniedWorkers 是否存在潜在问题。这个提议的解决方案在这种情况下是否存在问题?
  • 任务一次只分配给一个工人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多