你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
适用于 JavaScript 的 Azure 通信服务 (ACS) 作业路由器 SDK
此包包含适用于 Azure 通信服务 (ACS) 作业路由器服务的 JavaScript SDK。
入门
关键概念
请参阅 我们的作业路由器关键概念文档 ,以更好地了解作业路由器。
先决条件
- 一个 Azure 订阅。
- AZURE 通信服务 (ACS) 资源。
- 如果需要创建 ACS 资源,可以使用 Azure 门户、Azure PowerShell或 Azure CLI。
安装
npm install @azure/communication-job-router
浏览器支持
若要在网站上使用 Azure SDK 库,需要转换代码以在浏览器中工作。 使用名为 “捆绑程序”的工具执行此操作。 请参阅捆绑 文档 ,以更好地了解捆绑。
教程:使用 Azure 通信服务 (ACS) 作业路由器 SDK 将作业路由到辅助角色
本教程介绍:
- 如何创建队列。
- 如何创建辅助角色并将其分配到队列。
- 如何将作业路由到辅助角色。
- 如何订阅和处理作业路由器事件。
- 如何完成和关闭作业。
设置
(可选) 安装 IDE
安装 NodeJS
安装 NodeJS。
启动 NodeJS Express 服务器
在 shell (cmd、PowerShell、Bash 等 ) 中创建名为 RouterQuickStart
的文件夹,并在此文件夹中执行 npx express-generator
。 这将生成一个简单的 Express 项目,该项目将侦听 port 3000
。
示例
mkdir RouterQuickStart
cd RouterQuickStart
npx express-generator
npm install
DEBUG=routerquickstart:* npm start
具有 ACS 资源
在 Azure 门户中 创建 ACS 资源或使用现有资源。
安装 Azure ACS 作业路由器 SDK
在 RouterQuickStart
文件夹中,通过执行 npm install @azure/communication-job-router --save
安装 ACS 作业路由器 SDK。
路由作业
构造作业路由器客户端
首先,我们需要构造 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
});
作业生命周期
请参阅 我们的作业生命周期文档 ,以更好地了解作业的生命周期。
创建作业
此作业在之前创建的“Sales”队列中排队。
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 事件网格。
在上述示例中:
- 作业排队进入“Sales”队列。
- 选择一个辅助角色来处理作业,向该辅助角色发出作业优惠,并通过
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 门户。
- 在 Azure 门户中导航到 ACS 资源,并打开“事件”边栏选项卡。
- 为“RouterWorkerOfferIssued”事件添加事件订阅。
- 选择适当的方法来接收事件 (例如 Webhook、Azure Functions、服务总线) 。
请参阅我们的 “订阅作业路由器事件”文档 ,以更好地了解订阅作业路由器事件。
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
- 接受工作机会的工作线程的 ID。offerId
- 正在接受或拒绝的产品/服务的 ID。
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,请阅读 参与指南 ,详细了解如何生成和测试代码。