2016-03-21 10 views
1

Unterstützt der Azure Service Bus-Abonnementclient die Verwendung der OnMessage-Aktion, wenn für das Abonnement eine Sitzung erforderlich ist?Azure, SubscriptionClient.OnMessage und Sitzungen

Ich habe ein Abonnement, "TestSubscription" genannt. Es erfordert eine sessionId und enthält mehrteilige Daten, die durch eine SessionId verknüpft sind.

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); 
} 

In einem separaten Projekt habe ich einen Service Bus-Monitor und WorkerRole, und in der Worker Rolle, ich habe eine SubscriptionClient, genannt "testSubscriptionClient":

testSubscriptionClient = SubscriptionClient.CreateFromConnectionString(connectionString, _topicName, CloudConfigurationManager.GetSetting("testSubscription"), ReceiveMode.PeekLock); 

Ich würde dann gerne hätte OnMessage ausgelöst, wenn neue Elemente in den Servicebus Warteschlange gestellt werden:

testSubscriptionClient.OnMessage(PersistData); 

jedoch habe ich die folgende Meldung erhalten, wenn ich den Code ausführen:

InvalidOperationException: Es ist für ein Unternehmen nicht möglich, die Sitzungen erfordert einen nicht-sitzungsNachrichtenEmpfänger

Ich bin mit Azure SDK v2.8 zu erstellen.

Ist das, was ich suche, möglich? Gibt es bestimmte Einstellungen, die ich in meinem Service-Bus-Monitor, Abonnement-Client oder anderswo vornehmen muss, damit ich auf diese Weise Nachrichten vom Abonnement abrufen kann? Als Randbemerkung funktioniert dieser Ansatz in anderen Fällen, in denen ich keine gesichteten Daten verwende.

Antwort

1

Können Sie diesen Code versuchen:

var messageSession=testSubscriptionClient.AcceptMessageSession(); 

messageSession.OnMessage(PersistData); 

neben dieser:

testSubscriptionClient.OnMessage(PersistData); 

Edit: Auch Sie Ihre Handler-Sitzungen behandeln registrieren können (RegisterSessionHandler). Es wird Ihren Griff jede neue Aktion auslösen.

Ich denke, das ist besser für Ihr Problem geeignet.

Er zeigt beide Wege, in diesem article. Es ist für die Warteschlange, aber ich denke, dass Sie dies auch auf das Thema anwenden können.

+0

Das funktioniert für eine Nachricht beim Start; Das bedeutet, dass AcceptMessageSession die nächste Sitzung vom Service-Bus-Abonnement abruft und wie vorgesehen ausgeführt wird. Wenn jedoch andere gesendete Nachrichten im Servicebus vorhanden sind, werden sie nicht abgerufen. Sollte dieser Aufruf in der Run() -Methode platziert werden? –

+0

Ich denke, nachdem Sie Nachrichten erhalten, sollten Sie AcceptMessageSession erneut aufrufen. Überprüfen Sie hier http://www.jayway.com/2014/08/28/routing-commands-using-azure-service-bus-sessions/ Dies ist für Async. –

+0

Das macht Sinn. Außer dass ich nicht weiß, wann Nachrichten in den Servicebus eingegeben werden. Daher muss mein Dienst-Bus-Monitor in der Lage sein, neue Nachrichten zu erkennen und ein Ereignis auszulösen, wenn neue Nachrichten entdeckt werden. Es scheint, als ob die Lösung in der Verbindung oder auch nur den Aufruf von AcceptMessageSession davon abhängt, dass ich weiß, dass neue Sitzungen warten, und dass ich einen "Auslöser" habe, um besagten Code aufzurufen. –