获取特定于租户 ID 的消息

Getting message Specific to Tenant Id

当前主题接收所有消息,与 TenantId

无关

但我的要求是只有属于特定 TenantId 的消息才应该在接收端接收。

示例:

目前情况如下

Message 1 Tenant 1 => Receiver
Message 2 Tenant 2 => Receiver

但现在它应该表现如下:

Message 1 Tenant 1 => Receiver(Tenant1)
Message 2 Tenant 2 => Receiver(Tenant2)

是否可以通过PartitionKeyId来实现?

有什么建议吗?提前致谢。

您可以在主题上为每个订阅者添加规则,该规则将决定是否应将消息发送到订阅者队列。

无法在 Azure 门户中手动添加规则,但您可以根据 Microsoft.ServiceBus nuget 包

通过以下脚本添加它们
var topicName = "yourTopicName";
var serviceBusConnectionString = "yourServiceBusManageRule";
var nameSpaceMgr = NamespaceManager.CreateFromConnectionString(serviceBusConnectionString);
var messagingFactory = MessagingFactory.CreateFromConnectionString(serviceBusConnectionString);
var tenants = new List<string>{ "Tenant1", "Tenant2" };

foreach (var tenant in tenants)
{
    var subscriptionClient = messagingFactory.CreateSubscriptionClient(topicName, tenant);
    var subscriberFilter = new SqlFilter($"Tenant = '{tenant}'");
    var subscriberRuleName = "TenantRule";
    var subscriberRule = new RuleDescription(subscriberRuleName, subscriberFilter);

    var defaultRule = "$Default";
    if (nameSpaceMgr.GetRules(topicName, tenant).Any(r=> r.Name == defaultRule))
    {
        subscriptionClient.RemoveRule(defaultRule);
    }

    if (nameSpaceMgr.GetRules(topicName, tenant).Any(r => r.Name == subscriberRuleName))
    {
        subscriptionClient.RemoveRule(subscriberRuleName);
    }
    subscriptionClient.AddRule(subscriberRule);
}

然后在topic上发送BrokeredMessage(Microsoft.ServiceBus.Messaging包)时,用当前租户

定义Tenant属性
var msg = new BrokeredMessage(e);
msg.Properties.Add("Tenant", "Tenant1");