Sie sind hier: Weblog

Azure AppFabric Topics und WCF

Foto ,
19.07.2011 13:44:00

 Mit der Mai CTP von Azure AppFabric [1] stellt Microsoft erstmals eine Implementierung von Topics zur Verfügung – wenn auch vorerst lediglich über die Azure-Cloud. Über ein REST-Interface oder einen .NET-Wrapper können damit Nachrichten an Abonnenten versendet werden. Darüber hinaus besteht auch die Möglichkeit, Topics direkt über WCF zu verwenden. Bei solchen Szenarien nehmen WCF-Services die Rolle der Abonnenten ein und WCF-Clients die Rolle des Verlegers.

Das nachfolgende Beispiel demonstriert dies. Dazu kommt ein Topic FlugBuchungenTopic mit zwei Abonnenten zum Einsatz: Accounting und BonusMilesManager. Letzterer weist auch einen Filter auf. Dieser schließt Flugbuchungen, die nicht von Vielfliegern stammen, aus. Die zum Filtern benötigten Daten müssen allerdings zusätzlich in Form von Nachrichteneigenschaften übertragen werden. Deswegen kommt beim Senden der OperationContext zum Einsatz, um diese Metadaten als Teil einer Instanz von BrokeredMessageProperty zu hinterlegen. Die Service-Operation ruft am Begin diese Instanz, welche in der Auflistung IncomingMessageProperties zu finden sind, ab.

private void CreateIfNotExist(string suffix)
{
    SharedSecretCredential myManagementCredentials =
        TransportClientCredentialBase.CreateSharedSecretCredential(IssuerName, IssuerKey);

    ServiceBusNamespaceClient namespaceClient = new ServiceBusNamespaceClient(
        ServiceBusEnvironment.CreateServiceUri("sb", ServiceNamespace, string.Empty),
        myManagementCredentials);

    string topicName = "FlugBuchungenTopic" + suffix;

    Topic myTopic;
    myTopic = namespaceClient.GetTopics().FirstOrDefault(t => t.Path == topicName.ToLower());
    if (myTopic == null)
    {
        myTopic = namespaceClient.CreateTopic(topicName.ToLower());
    }

    var subs = myTopic.GetSubscriptions();
    if (subs.Count(s => s.Name == "Accounting".ToLower()) == 0)
    {
        SubscriptionDescription desc;
        desc = new SubscriptionDescription();
        desc.EnableDeadLetteringOnMessageExpiration = true;
                
        RuleDescription ruleDesc;
        ruleDesc = new RuleDescription();
        ruleDesc.FilterExpression = new SqlFilterExpression("IstVielFlieger = True");
        ruleDesc.FilterAction = new SqlFilterAction("set PremiumKunde = True");
                
                
        var acc = myTopic.AddSubscription("Accounting".ToLower(), desc /*, ruleDesc*/);

    }

    if (subs.Count(s => s.Name == "BonusMilesManager".ToLower()) == 0)
    {
        SubscriptionDescription desc;
        desc = new SubscriptionDescription();
        desc.EnableDeadLetteringOnMessageExpiration = true;

        var filter = new SqlFilterExpression("IstVielFlieger = True");

        myTopic.AddSubscription("BonusMilesManager".ToLower(), desc, filter);
    }

}

[ServiceContract()]
public interface IFlugBuchungService
{
    [OperationContract(IsOneWay = true)]
    void Buche(FlugBuchung b);
}