使用筛选的订阅从主题检索 Azure 服务总线消息



我正在尝试按照 Mark Heath 的控制台应用程序示例使用筛选的订阅检索服务总线主题消息。 但是,我实际上无法检索实际过滤的消息(已过滤1,已过滤2(。 消息确实被消耗了,但我无法查看它们,因为代码永远不会像处理未过滤的消息 (AllMessages( 那样进入回调函数。 关于我错过了什么的任何想法?

发件人代码

var body = "Hello World";
var message1 = new BrokeredMessage(body);
message1.Properties["From"] = "Ian Wright";
var message2 = new BrokeredMessage("Second message");
message2.Properties["From"] = "Alan Smith";
message2.Label = "important";
var message3 = new BrokeredMessage("Third message");
message3.Properties["From"] = "Kelly Smith";
message3.Label = "information";
var client =  TopicClient.CreateFromConnectionString(servicebusConnectionString, topicName);
 client.Send(message1);
 client.Send(message2);
 client.Send(message3);

接收器代码

const string topicName = "rightangle";
const string subscriptionName = "AllMessages";
const string sub1Name = "Filtered1";
const string sub2Name = "Filtered2";
NamespaceManager namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
if (!namespaceManager.SubscriptionExists(topicName, subscriptionName))
{
    namespaceManager.CreateSubscription(topicName, subscriptionName);
}
if (namespaceManager.SubscriptionExists(topicName, sub1Name))
{
    Console.WriteLine("Deleting subscription {0}", sub1Name);
    namespaceManager.DeleteSubscription(topicName, sub1Name);
}
Console.WriteLine("Creating subscription {0}", sub1Name);
namespaceManager.CreateSubscription(topicName, sub1Name, new SqlFilter("From LIKE '%Smith'"));
if (namespaceManager.SubscriptionExists(topicName, sub2Name))
{
    Console.WriteLine("Deleting subscription {0}", sub2Name);
    namespaceManager.DeleteSubscription(topicName, sub2Name);
}
Console.WriteLine("Creating subscription {0}", sub2Name);
namespaceManager.CreateSubscription(topicName, sub2Name, new SqlFilter("sys.Label='important'"));
var options = new OnMessageOptions();
var subClient =                    SubscriptionClient.CreateFromConnectionString(connectionString, topicName, subscriptionName);
subClient.OnMessage(m => MessageReceived(subscriptionName, m), options);
var subClient1 =                    SubscriptionClient.CreateFromConnectionString(connectionString, topicName, sub1Name);
subClient1.OnMessage(m => MessageReceived(sub1Name, m), options);
var subClient2 =                    SubscriptionClient.CreateFromConnectionString(connectionString, topicName, sub2Name);
subClient2.OnMessage(m => MessageReceived(sub2Name, m), options);
private static void MessageReceived(string subscriptionName, BrokeredMessage message)
{
   Console.WriteLine("{0} '{1}' Label: '{2}' From: '{3}'", subscriptionName,
            message.GetBody<string>(),
            message.Label,
            message.Properties["From"]);
}

代码很好。运行此示例后AllMessages包含三条消息,Filtered1有两条消息,Filtered2有一条消息。是否确定没有另一个使用代码的实例正在运行并检索这些消息?

AllMessages有一个默认的 SQL 筛选器,因此它是一个"全部捕获"订阅。过滤不会影响它,它应该收到发送到rightangle主题的任何消息。如果在其下看不到任何消息,则消息已被使用,或者应用程序正在重新生成实体,从而删除所有消息。

尝试更改接收方代码,不删除实体,而仅接收。并修改发件人以确保实体存在,如果未创建这些实体,则不删除。或者,您可以将两者(首先是接收方代码,然后是发送方(进行编码,您将看到消息。问题仅在于如何管理(删除(实体。

最新更新