Поддерживает ли клиент подписки на службу шины Azure возможность использования действия OnMessage, когда подписка требует сеанса?Azure, SubscriptionClient.OnMessage и сеансы
У меня есть подписка под названием «TestSubscription». Он требует sessionId и содержит многочастные данные, которые связаны SessionId.
if (!namespaceManager.SubscriptionExists("TestTopic", "Export"))
{
var testRule = new RuleDescription
{
Filter = new SqlFilter(@"(Action='Export')"),
Name = "Export"
};
var subDesc = new SubscriptionDescription("DataCollectionTopic", "Export")
{
RequiresSession = true
};
namespaceManager.CreateSubscription(sub`enter code here`Desc, testRule);
}
В отдельном проекте, у меня есть автобусный монитор и WorkerRole, и в Worker Role, у меня есть SubscriptionClient, называемый «testSubscriptionClient»:
testSubscriptionClient = SubscriptionClient.CreateFromConnectionString(connectionString, _topicName, CloudConfigurationManager.GetSetting("testSubscription"), ReceiveMode.PeekLock);
Я бы тогда хотел иметь OnMessage срабатывает, когда новые элементы помещаются в очередь обслуживания автобуса:
testSubscriptionClient.OnMessage(PersistData);
Однако я получаю следующее сообщение, когда я запускаю код:
InvalidOperationException: Это не представляется возможным для объекта, который требует сессий, чтобы создать не-sessionful ресивером сообщение
Я использую Azure SDK v2.8.
Является ли это тем, что я хочу сделать возможным? Существуют ли определенные настройки, которые мне нужно сделать в моем мониторе служебной шины, подписчивом клиенте или в другом месте, что позволит мне получать сообщения из подписки таким образом. Как замечание, этот подход отлично работает в других случаях, в которых я не использую сессионные данные.
Это работает для одного сообщения при запуске; это означает, что AcceptMessageSession получит следующий сеанс из подписки на служебную шину и выполнит его по назначению. Но если в служебной шине есть другие сеансовые сообщения, они не извлекаются. Должен ли этот вызов быть помещен в метод Run()? –
Я думаю, что после получения сообщений вы снова должны вызвать AcceptMessageSession. Проверьте здесь http://www.jayway.com/2014/08/28/routing-commands-using-azure-service-bus-sessions/ для асинхронного использования. –
Это имеет смысл. За исключением того, что я не знаю, когда сообщения будут введены в служебную шину. Поэтому мне нужен мой монитор служебной шины, чтобы иметь возможность обнаруживать новые сообщения и запускать событие при обнаружении новых сообщений. Похоже, что решение в ссылке или даже просто вызов AcceptMessageSession полагается на меня, зная, что ждут новые сеансы и имеет некоторый «триггер» для вызова указанного кода. –