2016-03-21 6 views
1

Поддерживает ли клиент подписки на службу шины 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.

Является ли это тем, что я хочу сделать возможным? Существуют ли определенные настройки, которые мне нужно сделать в моем мониторе служебной шины, подписчивом клиенте или в другом месте, что позволит мне получать сообщения из подписки таким образом. Как замечание, этот подход отлично работает в других случаях, в которых я не использую сессионные данные.

ответ

1

Вы можете попробовать этот код:

var messageSession=testSubscriptionClient.AcceptMessageSession(); 

messageSession.OnMessage(PersistData); 

рядом с этим:

testSubscriptionClient.OnMessage(PersistData); 

Edit: Кроме того, вы можете зарегистрировать свой обработчик для обработки сеансов (RegisterSessionHandler). Он будет запускать вашу ручку при каждом новом действии.

Я думаю, что это больше подходит для вашей проблемы.

Он показывает оба способа, в этом article. Это для очереди, но я думаю, вы можете применить это и к теме.

+0

Это работает для одного сообщения при запуске; это означает, что AcceptMessageSession получит следующий сеанс из подписки на служебную шину и выполнит его по назначению. Но если в служебной шине есть другие сеансовые сообщения, они не извлекаются. Должен ли этот вызов быть помещен в метод Run()? –

+0

Я думаю, что после получения сообщений вы снова должны вызвать AcceptMessageSession. Проверьте здесь http://www.jayway.com/2014/08/28/routing-commands-using-azure-service-bus-sessions/ для асинхронного использования. –

+0

Это имеет смысл. За исключением того, что я не знаю, когда сообщения будут введены в служебную шину. Поэтому мне нужен мой монитор служебной шины, чтобы иметь возможность обнаруживать новые сообщения и запускать событие при обнаружении новых сообщений. Похоже, что решение в ссылке или даже просто вызов AcceptMessageSession полагается на меня, зная, что ждут новые сеансы и имеет некоторый «триггер» для вызова указанного кода. –

Смежные вопросы