Получение сообщений служебной шины Azure из раздела с помощью отфильтрованной подписки

Я пытаюсь следовать примеру консольного приложения Марка Хита для получения службы Отправляйте тематические сообщения с помощью отфильтрованной подписки. Однако на самом деле я не могу получить фактические отфильтрованные сообщения (Filtered1, Filtered2). Сообщения действительно потребляются, но я не могу их просмотреть, потому что код никогда не попадает в функцию обратного вызова, как это происходит с нефильтрованными сообщениями (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"]);

}

person Durward White    schedule 02.02.2018    source источник


Ответы (1)


Код в порядке. После выполнения этого примера AllMessages содержит три сообщения, Filtered1 имеет два сообщения и Filtered2 имеет одно сообщение. Вы уверены, что нет другого экземпляра кода, который использует и не получает это сообщение?

AllMessages имеет фильтр SQL по умолчанию, так что это универсальная подписка. Фильтрация не повлияет на него, и он должен получить любое сообщение, отправленное в rightangle тему. Если вы не видите сообщений под ним, либо сообщения потребляются, либо приложение перестраивает объекты и, следовательно, удаляет все сообщения.

Попробуйте изменить код получателя, чтобы не удалять сущности, а только получать. И измените отправителя, чтобы убедиться, что сущности существуют, и если не создать их, но не удалить. В качестве альтернативы вы можете объединить два (сначала код получателя, а затем отправителя), и вы увидите сообщения. Проблема заключается исключительно в том, как сущности управляются (удаляются).

person Sean Feldman    schedule 02.02.2018
comment
Спасибо, ваш ответ заставил меня внимательнее взглянуть на свой код. В моем примере кода не было того факта, что я добавил блок try..catch..finally, а в разделе finally я включил метод Console.Readline (). Очевидно, подписка AllMessages будет обработана немедленно, а затем будет ждать в Readline (), пока не будет нажата клавиша, прежде чем обрабатывать оставшуюся часть кода. Удаление Readline () позволило соответствующим образом обработать и отфильтровать сообщения. Спасибо. - person Durward White; 05.02.2018
comment
Рад, что помог тебе. - person Sean Feldman; 05.02.2018