当前,主题与 TenantId
无关。但是我的要求是,仅应在接收方接收属于特定 TenantId 的消息。
示例:
目前正在发生以下情况
消息1租户1 =>接收者
消息2租户2 =>收件人
但是现在它应该表现如下:
消息1租户1 =>收件人(Tenant1)
消息2租户2 =>收件人(Tenant2)
是否可以通过PartitionKeyId来实现?
有什么建议吗?预先感谢。
答案 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");