获取特定于租户ID的消息

时间:2018-10-10 14:23:53

标签: c# azure azureservicebus

当前,主题与 TenantId

无关。

但是我的要求是,仅应在接收方接收属于特定 TenantId 的消息。

示例:

目前正在发生以下情况

  

消息1租户1 =>接收者
  消息2租户2 =>收件人

但是现在它应该表现如下:

  

消息1租户1 =>收件人(Tenant1)
  消息2租户2 =>收件人(Tenant2)

是否可以通过PartitionKeyId来实现?

有什么建议吗?预先感谢。

1 个答案:

答案 0 :(得分:0)

您可以在主题上的每个订户上添加一条规则,该规则将决定是否将消息发送到订户队列。

无法在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);
}

然后在发送有关该主题的BrokeredMessage(Microsoft.ServiceBus.Messaging包)时,使用当前租户定义Tenant属性

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