我参与了一个多层项目,其中一部分正在消耗来自第三方系统的“事件”流。供应商通过Azure Service Bus主题发布这些主题 - 他们提供,控制和提供管理公交车。我们只提供了URI,TopicName和Subscription详细信息。
我们的方法是使用SDK中提供的ServiceBusTrigger
组合一个Webjob,以处理收听新消息的问题。触发将它们处理到我们的系统中。然而,由于这项工作一直无法从主题中读取,我们似乎已经遇到了障碍。这项工作失败了,模糊Timeout Exception
:
Unhandled Exception: System.TimeoutException: The timeout elapsed upon attempting to obtain a token while accessing 'https://****-sb.accesscontrol.windows.net/WRAPv0.9/'.
---> System.IdentityModel.Tokens.SecurityTokenException: The token provider was unable to provide a security token while accessing 'https://****-sb.accesscontrol.windows.net/WRAPv0.9/'.
Token provider returned message: 'The operation has timed out'.
但更进一步,跟踪包括:
[ERR] at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result)
[ERR] at Microsoft.ServiceBus.NamespaceManager.OnEndTopicExists(IAsyncResult result)
[ERR] at Microsoft.ServiceBus.NamespaceManager.EndTopicExists(IAsyncResult result)
供应商随后确认订阅对主题的唯一许可/声明为Listen
任何人都可以确认ServiceBusTrigger
的权限要求是什么吗?
并且作为+1,假设它出于某种原因需要更多Listen
(即需要Manage
),是否有人愿意建议另一种方法?失去WebJob基础设施似乎是一种耻辱(该项目已经有3个其他工作) - 特别是丢失了async和amp;等功能。并行处理来自主题的消息
答案 0 :(得分:5)
要关闭此功能,我们已对WebJobs SDK进行了建议的更改(此处提取请求:https://github.com/Azure/azure-webjobs-sdk/pull/528)。这将在下一个版本中。以下是您如何为每个属性指定AccessRights的示例:
public static void JobFunction(
[ServiceBusTrigger("inputqueue", AccessRights.Listen)] string message,
[ServiceBus("outputqueue", AccessRights.Send)] out string message)
{
. . .
}
未指定时,默认为"管理"。当设置为manage以外的任何内容时,SDK将不会尝试创建任何SB资源。我认为这符合您的需求?
答案 1 :(得分:1)
SDK进行以下调用,这需要管理权限。 Microsoft.Azure.WebJobs.ServiceBus.Listeners.NamespaceManagerExtensions。 如果您无法设置这些权限,一种替代方法是不将SDK用于服务总线触发器,而是将其用于其他所有内容。