【问题标题】:TWILIO : Filtering TaskQueues with "evaluateWorkerAttributes" resulting in Time Out errorTWILIO:使用“evaluateWorkerAttributes”过滤任务队列导致超时错误
【发布时间】:2021-02-09 22:15:57
【问题描述】:

每当我尝试过滤 TaskQueue 时,都会遇到 "runtime application timed out" 错误。这是完整的场景。

在 twilio flex 接触板上,我必须显示代理所属的所有任务队列中待处理任务的累积计数。为此,我编写了一个 twilio 函数,它将工作人员的技能作为输入,并根据提供的技能过滤 TaskQueue,并计算待处理的任务。我遵循了here 提供的 twilio 文档。 我尝试了不同的方法来编写表达式,但最终都导致超时错误。

worker属性定义如下

{
  "routing": {
    "skills": [
      "German",
      "English",
      "French"
    ],
    "domains": [
      "ABC"
    ],
    "categories": [
      "XYZ"
    ],
    "levels": {
      "XYZ": 34
    },
    "platforms": [
      "Platform1"
    ],
    "provider": "Provider_1"
  },
  "full_name": "XXXXXXX",
  "image_url": "https:\/\/www.avatar.co\/avatar\/91f0e496?d=mp",
  "roles": [
    "admin",
    "wfo.full_access"
  ],
  "contact_uri": "client:XXX.YYYY",
  "disabled_skills": {
    "skills": [],
    "levels": {}
  },
  "email": "test@email.com"
}

下面的代码 sn-p 过滤队列。

const TokenValidator = require('twilio-flex-token-validator').functionValidator;

const WORKSPACE_ID = 'WSXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
const workerSkills = ['English','French'];
console.log('SKILLS IN FUNC : ' + `routing.skills IN [${workerSkills}]`);
const getQueues = (client) => {
    return new Promise ((resolve, reject) => {
        client.taskrouter.v1.workspaces(WORKSPACE_ID)
        .taskQueues 
        .list({evaluateWorkerAttributes:'{"routing.skills" : "${workerSkills}" }',
        //.list({evaluateWorkerAttributes:"routing.skills HAS 'French'",
            limit: 1000
        })
        .then(taskQueues => resolve(taskQueues))
    });
}

const getQueueRealTimeStatistics = (client, queueID) => {
    return new Promise ((resolve, reject) => {
        client.taskrouter.v1.workspaces(WORKSPACE_ID)
        .taskQueues(queueID)
        .realTimeStatistics()
        .fetch()
        .then(realTimeStatistics => resolve(realTimeStatistics))
    });
}

exports.handler = function(context, event, callback) {
    const client = context.getTwilioClient();
    let pendingTasks = 0;
    const promises = [];
    const response = new Twilio.Response();
    response.appendHeader('Access-Control-Allow-Origin', '*');
    response.appendHeader('Access-Control-Allow-Methods', 'OPTIONS POST GET');
    response.appendHeader('Access-Control-Allow-Headers', 'Content-Type');
    response.appendHeader('Content-Type', 'application/json');
    
    getQueues(client).then(res => res.forEach(x => {
        promises.push(getQueueRealTimeStatistics(client, x.sid));
        console.log('queueID : ' + x.sid);
    })).then(x => {
        Promise.all(promises).then(res => {
            
        res.forEach(y => {
            pendingTasks = pendingTasks+ parseInt(y.tasksByStatus.pending,10);
        })
           //response.setBody(pendingTasks);
           response.setBody(pendingTasks + parseInt(res, 10));
        })
        .then(x => callback(null, response))
        .catch(err => {
            console.log(err.message);
            response.appendHeader('Content-Type', 'plain/text');
            response.setBody(err.message);
            response.setStatusCode(500);
            // If there's an error, send an error response
            // Keep using the response object for CORS purposes
            callback(null, response);
        });  
    })
};

谁能帮忙解决这个问题。提前致谢。

【问题讨论】:

  • 如何从 Twilio 函数返回数据?可以分享整个函数代码吗?
  • 功能完整编辑原帖
  • 在哪里?请使用更多代码更新问题。谢谢!
  • 刚刚将代码添加到问题中

标签: twilio twilio-api twilio-programmable-chat


【解决方案1】:

这里是 Twilio 开发者宣传员。

看起来您的函数大部分编写正确,应该返回。我能想到的有两件事可能会出错。

真的是超时了

我不确定您有多少队列,但是获取所有队列然后获取每个队列的所有统计信息可能只是将您的函数推送到10 second limit for Function execution。如果是这种情况,那么可能必须分解函数以便它可以在时间内运行。你能在本地运行它(使用Twilio Serverless Toolkit)并且它成功了吗?

有一个错误没有被捕获,promise 没有解决

您的代码在我看来是正确的,但是您将 API 调用的结果包装在新的 Promise 中的方式意味着,如果出现错误,包装 Promise 永远不会解析或拒绝。这意味着函数会挂起等待结果,直到发生超时。

问题是,您不需要将 API 调用包装在新的 Promise 中,它们已经返回 Promise。

我会尝试像这样重写它,避免使用新的 Promise 包装器,然后查看是否存在您没有发现的错误。你也可以避免将 Promise 推入数组,直接跳入 Promise.all

const TokenValidator = require("twilio-flex-token-validator").functionValidator;

const WORKSPACE_ID = "WSXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
const workerSkills = ["English", "French"];
console.log("SKILLS IN FUNC : " + `routing.skills IN [${workerSkills}]`);
const getQueues = (client) => {
  return client.taskrouter.v1.workspaces(WORKSPACE_ID).taskQueues.list({
    evaluateWorkerAttributes: '{"routing.skills" : "${workerSkills}" }',
    //.list({evaluateWorkerAttributes:"routing.skills HAS 'French'",
    limit: 1000,
  });
};

const getQueueRealTimeStatistics = (client, queueID) => {
  return client.taskrouter.v1
    .workspaces(WORKSPACE_ID)
    .taskQueues(queueID)
    .realTimeStatistics()
    .fetch();
};

exports.handler = function (context, event, callback) {
  const client = context.getTwilioClient();
  let pendingTasks = 0;
  const response = new Twilio.Response();
  response.appendHeader("Access-Control-Allow-Origin", "*");
  response.appendHeader("Access-Control-Allow-Methods", "OPTIONS POST GET");
  response.appendHeader("Access-Control-Allow-Headers", "Content-Type");
  response.appendHeader("Content-Type", "application/json");

  getQueues(client)
    .then((queues) => {
      return Promise.all(
        queues.map((queue) => {
          console.log("queueID : " + queue.sid);
          return getQueueRealTimeStatistics(client, queue.sid);
        })
      );
    })
    .then((queueStats) => {
      queueStats.forEach((queueStat) => {
        pendingTasks = pendingTasks + parseInt(queueStat.tasksByStatus.pending, 10);
      });
      response.setBody({ pendingTasks });
    })
    .then(() => callback(null, response))
    .catch((err) => {
      console.log(err.message);
      response.appendHeader("Content-Type", "plain/text");
      response.setBody(err.message);
      response.setStatusCode(500);
      // If there's an error, send an error response
      // Keep using the response object for CORS purposes
      callback(null, response);
    });
};

这样做也减少了一些嵌套。如果有帮助,请告诉我。

【讨论】:

  • 按照您的建议修改代码后问题解决,属性过滤器改为:{evaluateWorkerAttributes: JSON.stringify({routing:{skills: workerSkills}}。感谢您的支持..!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-17
  • 2016-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多