【问题标题】:Botframework: how to handle long running tasks with a bot?Botframework:如何使用机器人处理长时间运行的任务?
【发布时间】:2018-11-01 16:16:03
【问题描述】:

如何在机器人上处理长时间运行的任务,以便客户端在 15 秒后不再重试发送消息。

我有一个带有 botframework v3 的机器人,并将客户端与 Directline 连接

【问题讨论】:

  • 你有没有告诉你的客户如果机器人需要很长时间不要重试命令?

标签: c# botframework


【解决方案1】:

Direct Line 通道连接器本身不会重试发送消息。如果它在向您的机器人发送消息后的 15 秒内没有收到确认,它将抛出 网关超时

如果您使用 DirectLineClient,您可以覆盖重试策略,确保客户端不会重试消息:

DirectLineClientCredentials creds = new DirectLineClientCredentials(directLineSecret);
DirectLineClient directLineClient = new DirectLineClient(new Uri("https://directline.botframework.com"), creds);
directLineClient.SetRetryPolicy(new Microsoft.Rest.TransientFaultHandling.RetryPolicy(new Microsoft.Rest.TransientFaultHandling.HttpStatusCodeErrorDetectionStrategy(), 0));

如果您有一个长时间运行的进程,需要超过 15 秒,请考虑在某处将消息排队,以便您可以立即确认调用,然后在后台线程上处理消息。这在概念上称为主动消息传递。更多信息可以在这里找到:https://docs.microsoft.com/en-us/azure/bot-service/dotnet/bot-builder-dotnet-proactive-messages?view=azure-bot-service-3.0

编辑:这篇博文还解释了一种在机器人中处理长操作的方法,该方法使用 Azure 队列存储和一个 Azure 函数来处理操作并在完成时调用机器人: Manage a long-running operation

另一种选择是在后台线程上处理传入消息或长时间处理消息。此实验示例演示了使用此设计的一些方法: Immediate Accept Bot

【讨论】:

  • 什么是更好的选择?
  • 哪个选项“更好”是见仁见智的问题,涉及许多因素。您使用的是哪个频道?长期运行的进程是一直运行很长时间,还是只是有时?
  • 我们直接运行,它只是有时机器人需要分析东西
  • 对于长时间运行的进程,一个更好的选择是将消息排队,确认调用,在后台线程上处理消息,并将响应作为主动消息发送。
猜你喜欢
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 2021-09-11
  • 2023-03-17
  • 2013-01-12
相关资源
最近更新 更多