Как предложить задание конкретному работнику на Twilio

Я использую TasksRouter от Twilio.

У меня есть 3 TaskQueues в моей рабочей области, и новые задачи перенаправляются на правильный TaskQueue, но я также хотел бы, чтобы их предлагали конкретному работнику в этой очереди.

Я думал, что атрибуты задачи должны делать это, но даже когда моя задача имеет такие атрибуты, как {user_id: 123} задача все еще предлагается работнику с такими атрибутами, как {user_id: 999}

Это правильный подход? Как еще я могу предложить задание конкретному работнику?

Спасибо!

4 ответа

Решение

Twilio разработчик евангелист здесь.

Чтобы отправить задачу конкретному работнику, вам нужно настроить условие в рабочем процессе TaskRouter на основе user_id атрибут, который вы дали задание. Вы можете установить его в соответствии с атрибутом и направить задачу в очередь, которая управляется только этим работником.

Это также может быть достигнуто с помощью фильтра известных рабочих в рабочем процессе задачи.

Известный рабочий можно использовать, если рабочий, который должен быть выбран здесь, уже известен. Выберите, будет ли Worker идентифицирован по понятному имени Worker или SID Worker. Укажите поле в атрибутах задачи, которое содержит соответствующую информацию (например, «task.worker_friendly_name»).

Я сделал это с помощью reservation.created события. Я использую стандартный рабочий процесс и очередь задач, а затем программно отклоняю все резервирования до тех пор, пока резервирование не будет выполнено с помощью подходящего агента, после чего я принимаю его.

В интерфейсе TaskRouter в консоли Twilkio я добавил веб-перехватчик на reservation.createdсобытие, указывающее на мой сервер. Затем запрос обрабатывается следующим образом:

@app.route('/hook/reservation', methods=['POST'])
def fn_th_reservation():

    task_attributes = json.loads(request.form['TaskAttributes'])
    channel_sid = task_attributes["channelSid"]
    worker_sid = request.form['WorkerSid']
    reservation_sid = request.form["ReservationSid"]
    workspace_sid = request.form["WorkspaceSid"]
    task_sid = request.form["TaskSid"]

    # implement app specific logic here. you can use channel_sid and
    # worker_sid to compare them to a mapping from you database for instance
    is_right_worker = ...

    reservation_status = 'accepted' if is_right_worker else 'rejected'

    client = Client(account_sid, auth_token)
    # accept or reject reservation
    reservation = client.taskrouter.workspaces(workspace_sid) \
        .tasks(task_sid).reservations(reservation_sid) \
        .update(reservation_status=reservation_status)

    print(reservation.worker_name)
    print(reservation.reservation_status)

    return('200')

просто убедитесь, что вы не создаете бесконечный цикл, отклоняя каждый рабочий

Гораздо лучшее решение этой проблемы, чем общепринятый ответ, — это просто настроить специальный рабочий процесс для пересылки задач. Маршрутизация для такого рабочего процесса может выглядеть так...

      {
  "task_routing": {
    "filters": [
      {
        "filter_friendly_name": "forward-filter",
        "expression": "1==1",
        "targets": [
          {
            "queue": "WQxxxx",
            "known_worker_sid": "task.worker_sid"
          }
        ]
      },
    "default_filter": {
      "queue": "WQxxxx"
    }
  }
}

Очередь WQxxxx нацелена на всех работников, которым можно перенаправить задачу. Итак, в вашем случае вы хотите иметь 3 рабочих процесса, один из которых нацелен на каждую из 3 настроенных вами очередей задач.

Преимущество этого подхода в том, что вам не нужно настраивать новую очередь задач для каждого работника.

Поэтому, когда вы создаете задачу и хотите назначить ее конкретному работнику, используйте рабочий процесс для конкретной очереди, на которую вы хотите ориентироваться, и добавьте worker_sid для пользователя в атрибуты задачи.

Недостатком этого подхода является то, что вам необходимо быть уверенным, что работник сможет принять резервирование, которое будет создано для него/нее. Если резервирование отклонено, то одно и то же резервирование будет создаваться снова и снова, поскольку время резервирования либо истекает, либо оно отклоняется. Вы не сможете перенаправить задачу другому работнику, изменив worker_sid в атрибутах задачи. Вам нужно будет удалить задачу и начать заново.

Другие вопросы по тегам