Поделиться через


пакет SDK для маршрутизатора заданий Службы коммуникации Azure (ACS) для JavaScript

Этот пакет содержит пакет SDK javaScript для службы маршрутизатора заданий Службы коммуникации Azure (ACS).

Приступая к работе

Основные понятия

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

Предварительные требования

Установка

npm install @azure/communication-job-router

Поддержка браузеров

Чтобы использовать библиотеки azure SDK на веб-сайте, необходимо преобразовать код для работы в браузере. Для этого используется средство с именем bundler. Чтобы лучше понять объединение, ознакомьтесь с нашей документацией по объединениям.

Руководство. Маршрутизация заданий в рабочие роли с помощью пакета SDK для маршрутизатора заданий Службы коммуникации Azure (ACS)

Из этого руководства вы узнаете:

  • Как создать очередь.
  • Создание рабочих ролей и их назначение в очередь.
  • Маршрутизация заданий сотрудникам.
  • Как подписаться на события маршрутизатора заданий и обрабатывать их.
  • Как выполнять и закрывать задания.

Настройка

(Необязательно) Установка интегрированной среды разработки

Установите интегрированную среду разработки, например VSCode или Webstorm.

Установка NodeJS

Установите NodeJS.

Запуск сервера NodeJS Express

В оболочке (cmd, PowerShell, Bash и т. д.) создайте папку с именем RouterQuickStart и в ней выполните .npx express-generator Это приведет к созданию простого проекта Express, который будет прослушивать .port 3000

Пример

mkdir RouterQuickStart
cd RouterQuickStart
npx express-generator
npm install
DEBUG=routerquickstart:* npm start

Использование ресурса ACS

Создайте ресурс ACS на портале Azure или используйте существующий ресурс.

Установка пакета SDK для маршрутизатора заданий Azure ACS

В папке RouterQuickStart установите пакет SDK для маршрутизатора заданий ACS, выполнив npm install @azure/communication-job-router --save.

Задания маршрутизации

Создание клиентов маршрутизатора заданий

Сначала необходимо создать jobRouterAdministrationClient и jobRouterClient.

  • jobRouterAdministrationClient предоставляет методы для политик классификации, политик распространения, политик исключений и очередей.
  • jobRouterClient предоставляет методы для заданий и рабочих ролей.
const {
  JobRouterClient,
  JobRouterAdministrationClient,
} = require("@azure/communication-job-router");

const acsConnectionString =
  "endpoint=https://<YOUR_ACS>.communication.azure.com/;accesskey=<YOUR_ACCESS_KEY>";
const jobRouterClient = new JobRouterClient(acsConnectionString);
const jobRouterAdministrationClient = new JobRouterAdministrationClient(acsConnectionString);

Создание политики распространения

Эта политика определяет, какие работники будут получать предложения о заданиях по мере распространения заданий из очередей.

const distributionPolicy = await jobRouterAdministrationClient.createDistributionPolicy(
  "default-distribution-policy-id",
  {
    name: "Default Distribution Policy",
    offerExpiresAfterSeconds: 30,
    mode: {
      objectType: "longest-idle",
      minConcurrentOffers: 1,
      maxConcurrentOffers: 3,
    },
  }
);

Создание политики классификации

Эта политика классифицирует задания при создании.

const classificationPolicy = await jobRouterAdministrationClient.createClassificationPolicy("default-classification-policy-id", {
  name: "Default Classification Policy",
  fallbackQueueId: salesQueueResponse.Id,
  queueSelectors: [{
    kind: "static",
    labelSelector: { key: "department", labelOperator: "equal", value: "xbox" }
  }],
  workerSelectors: [{
    kind: "static",
    labelSelector: { key: "english", labelOperator: "greaterThan", value: 5 }
  }],
  prioritizationRule: {
    kind: "expression-rule",
    language: "powerFx";
    expression: "If(job.department = \"xbox\", 2, 1)"
  }
});

Создание очереди

Эта очередь предлагает задания для рабочих в соответствии с ранее созданной политикой распространения.

const salesQueueResponse = await jobRouterAdministrationClient.createQueue("sales-queue-id", {
  name: "Sales",
  distributionPolicyId: distributionPolicy.Id,
  labels: {
    department: "xbox",
  },
});

Создание рабочих ролей

Эти рабочие роли назначены в ранее созданную очередь "Продажи" и имеют некоторые метки.

  • значение availableForOffers означает true , что эти работники готовы принять предложения о работе.
  • Ознакомьтесь с нашей документацией по меткам , чтобы лучше понять метки и селекторы меток.
  // Create worker "Alice".
  const workerAliceId = "773accfb-476e-42f9-a202-b211b41a4ea4";
  const workerAliceResponse = await jobRouterClient.createWorker(workerAliceId, {
    totalCapacity: 120,
    labels: {
      Xbox: 5,
      german: 4
      name: "Alice",
    },
    queueAssignments: { [salesQueueResponse.Id]: {} },
    availableForOffers: true
  });

// Create worker "Bob".
const workerBobId = "21837c88-6967-4078-86b9-1207821a8392";
const workerBobResponse = await jobRouterClient.createWorker(workerBobId, {
  totalCapacity: 100,
  labels: {
    xbox: 5,
    english: 3
    name: "Bob"
  },
  queueAssignments: { [salesQueueResponse]: {} },
  availableForOffers: true
});

Жизненный цикл задания

Ознакомьтесь с документацией по жизненному циклу задания , чтобы лучше понять жизненный цикл задания.

Создание задания

Это задание помещается в очередь ранее созданной очереди "Продажи".

const job = await jobRouterClient.createJob("job-id", {
  // e.g. callId or chat threadId
  channelReference: "66e4362e-aad5-4d71-bb51-448672ebf492",
  channelId: "voice",
  priority: 2,
  queueId: salesQueueResponse.Id,
});

(Необязательно) Создание задания с помощью политики классификации

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

const classificationJob = await JobRouterClient.createJob("classification-job-id", {
  // e.g. callId or chat threadId
  channelReference: "66e4362e-aad5-4d71-bb51-448672ebf492",
  channelId: "voice",
  classificationPolicyId: classificationPolicy.Id,
  labels: {
    department: "xbox",
  },
});

События

События маршрутизатора заданий доставляются через Сетка событий Azure. Дополнительные сведения о Сетка событий Azure см. в документации по Сетка событий Azure.

В предыдущем примере:

  • Задание помещается в очередь "Продажи".
  • Для обработки задания выбирается рабочая роль, ей выдается предложение о задании, а RouterWorkerOfferIssued событие отправляется через Сетка событий Azure.

Пример RouterWorkerOfferIssued фигуры JSON:

{
  "id": "1027db4a-17fe-4a7f-ae67-276c3120a29f",
  "topic": "/subscriptions/{subscription-id}/resourceGroups/{group-name}/providers/Microsoft.Communication/communicationServices/{communication-services-resource-name}",
  "subject": "worker/{worker-id}/job/{job-id}",
  "data": {
    "workerId": "w100",
    "jobId": "7f1df17b-570b-4ae5-9cf5-fe6ff64cc712",
    "channelReference": "test-abc",
    "channelId": "FooVoiceChannelId",
    "queueId": "625fec06-ab81-4e60-b780-f364ed96ade1",
    "offerId": "525fec06-ab81-4e60-b780-f364ed96ade1",
    "offerTimeUtc": "2023-08-17T02:43:30.3847144Z",
    "expiryTimeUtc": "2023-08-17T02:44:30.3847674Z",
    "jobPriority": 5,
    "jobLabels": {
      "Locale": "en-us",
      "Segment": "Enterprise",
      "Token": "FooToken"
    },
    "jobTags": {
      "Locale": "en-us",
      "Segment": "Enterprise",
      "Token": "FooToken"
    }
  },
  "eventType": "Microsoft.Communication.RouterWorkerOfferIssued",
  "dataVersion": "1.0",
  "metadataVersion": "1",
  "eventTime": "2023-08-17T00:55:25.1736293Z"
}

Подписка на события

Одним из способов подписки на события маршрутизатора заданий ACS является портал Azure.

  1. Перейдите к ресурсу ACS на портале Azure и откройте колонку "События".
  2. Добавьте подписку на событие RouterWorkerOfferIssued.
  3. Выберите подходящее средство для получения события (например, веб-перехватчик, Функции Azure, служебная шина).

Ознакомьтесь с нашей документацией по подписке на события маршрутизатора заданий , чтобы лучше понять, как подписаться на события маршрутизатора заданий.

Маршрут в приложении NodeJS, которое получает события, может выглядеть следующим образом:

app.post('/event', (req, res) => {
    req.body.forEach(eventGridEvent => {
        // Deserialize the event data into the appropriate type
        if (eventGridEvent.eventType === "Microsoft.EventGrid.SubscriptionValidationEvent") {
            res.send({ validationResponse: eventGridEvent.data.validationCode };
        } else if (eventGridEvent.eventType === "Microsoft.Azure.CommunicationServices.RouterWorkerOfferIssued") {
           // RouterWorkerOfferIssued handling logic;
        } else if ...
    });
    ...
});

Принятие или отклонение предложения о задании

Получив событие, RouterWorkerOfferIssued вы можете принять или отклонить предложение о работе.

  • workerid — идентификатор работника, принимающего предложение о задании.
  • offerId — идентификатор принятого или отклоненного предложения.
const acceptResponse = await jobRouterClient.acceptJobOffer(workerId, offerId);
// or
const declineResponse = await jobRouterClient.declineJobOffer(workerId, offerId);

Завершение задания

Для assignmentId завершения задания требуется ответ, полученный из предыдущего шага.

await jobRouterClient.completeJob(jobId, assignmentId);

Закрытие задания

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

await jobRouterClient.closeJob(jobId, assignmentId, { dispositionCode: "Resolved" });

Дальнейшие действия

Дополнительные подробные примеры использования этого пакета SDK см. в каталоге примеров .

Участие

Если вы хотите внести свой вклад в этот пакет SDK, ознакомьтесь с руководством по участию , чтобы узнать больше о сборке и тестировании кода.