Azure ServiceBus 订阅客户端 <--> 服务器通信(接收和响应)

标签 azure service communication servicebus subscribe

如何在 Azure 中实现客户端 <--> 服务器与 ServiceBus 的通信?

目前我创建了一个新的队列名称“TestQueue”。我在队列上创建了一个名为“TestTopic”的主题,并进行了一个订阅,该订阅使用 SqlFilterRule (Device = 'A') 监听名称“DeviceA”。

然后我创建了一个客户端,它将包发送到上面指定的队列,并且我在那里收到一条消息,我可以对其进行评估,一切都很好。

现在我想向我的客户发回一些东西,也许我想与客户“继续交谈”。因此,我正在考虑来自 DeviceA(正在监听订阅)和客户端的“直接”连接,即与设备通信并监听订阅。

我希望你明白我想要什么,也许服务总线并不正是我所需要的......

最佳答案

让客户端拥有一个回复队列。然后,客户端可以在发送到最终接收者的消息的 ReplyTo 属性上传递该队列的地址,然后接收者转身与该队列进行对话。这是一种常见的模式,也是我们拥有该内置属性的原因。

如果您跨 SB 命名空间使用此方法(即回复队列位于不同的命名空间)或者您使用差异化访问控制,即客户端仅拥有“发送”权限到目标主题/队列,并且不希望每个人都能够发送到自己的回复队列。

客户端将短期 token 传递给接收者以允许其发送回复的实现方法是:

var token = 
        TokenProvider.CreateSharedAccessSignatureTokenProvider( 
                [[rulename]], [[key]]) 
       .GetWebTokenAsync([[targetUri]], string.Empty, true, 
                TimeSpan.FromHours(1))
       .GetAwaiter().GetResult(); 

在您的命名空间或回复队列中拥有具有“发送”权限的 SAS 规则,并将其用于 [[rulename]] 和 [[key]]。 [[targetUri]] 是回复队列的完全限定 URI(带有命名空间)。时间跨度表示该 token 的有效时间。我这里用的是一个小时,但很可能是几秒钟、几分钟或一天。

然后您将该 token 与消息一起传递;它可以驻留在名为“ReplyToToken”的(自定义)消息属性中。

接收者从该属性中获取 token ,然后用它创建一个 token 提供者

TokenProvider.CreateSharedAccessSignatureTokenProvider(tokenValue)));

然后你create a fresh MessagingFactory使用 ReplyTo 值和此 token 提供程序的基本 URI(无路径),然后使用 ReplyTo 值的路径的 QueueClient。

为了保持对话继续进行,您可以将 QueueClient 和工厂保存在以 ReplyTo URI 为键的查找表中,并且不会在每次收到消息时重新创建回复路径,而是从缓存中获取消息。

关于Azure ServiceBus 订阅客户端 <--> 服务器通信(接收和响应),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34224024/

相关文章:

azure - 错误: Rotate certificates in Azure Kubernetes Service (AKS)

azure - 创建Azure VM无法选择 "europe"

azure - 在 Powershell 中为 Azure Data Lake 目录创建 SAS token

java - 无法在线程内创建处理程序。如何使用 Looper.prepare()?

Windows 服务无法打开 COM 端口

iOS - WatchKit 如何将消息/数据从 iPhone 应用程序发送到 WatchKit 应用程序?

c - 使用 glib 通过 USB 将原始字节发送到 FTDI 设备

azure - 如何在 Windows Azure 应用程序中使用通配符子域?

swift - 如何将变量从 ViewController 类传递到其他结构?

c# - ServiceController.Stop() 后服务未完全停止