Implementierung eines Business Events
Am besten führst du deine Implementierung fort.
Alternativ kannst du auch folgenden Startpunkt der Implementierung im TFS wählen:
https://tfsprod.schleupen-ag.de/tfs/DefaultCollection/CS3/_git/cs-Schleupen.AS.MT.BIB?path=%2F&version=GBfeature%2FDevCampus-BusinessEvents&_a=contents
Zur Implementierung verwende bitte einen Feature Branch wie in Erstellen eines Feature Branches beschrieben.
Nun werden wir das Business Event "Bucher ausgeliehen" implementieren. Dazu müssen wir das Service-Interface IBuecherAusgeliehenEventService
aus der vorherigen Übung implementieren.
Die Implementierung soll in einer separaten Solution erfolgen. Um den Aufwand möglichst gering zu halten, ist im Unterverzeichnis Bibliotheksverwaltung.SubscriptionDemo bereits eine Solution vorhanden. Diese Solution muss zu Beginn einmalig mit "Edit-OpenCSSolutionConfiguration" konfiguriert und mittels "Open-CSSolution" geöffnet werden (siehe auch Erstellen eines Feature Branches).
Sobald die Bibliotheksverwaltung.SubscriptionDemo in Visual Studio geöffnet ist, müssen die folgenden Schritte durchgeführt werden:
1. Die WSDL des Business Event Service muss, unter SubscriptionTest.Subscription.Contracts\Benutzerkonten abgelegt werden. Die WSDL kannst du (entweder aus dem Service Interface Repository manuell laden oder) die Extension "Schleupen ServiceInterfaceRepository Extension" verwenden:
Über "Zum Projekt hinzufügen" kann man diese den Projekt hinzufügen. In der Proketmappe sollte das Ergebnis wie folgt aussehen:
In den Eigenschaften der WSDL hinterlegen wir als Benutzerdefiniertes Tool 'Sigento' (falls noch nicht geschehen), so dass C#-Code für die Schnittstellen und deren Typen generiert wird.
2. Den Service selber implementieren wir im Projekt "SubscriptionTest.Services" im Subnamensraum Schleupen.AS.MT.BIB.Benutzerkonten.BuecherAusgeliehenEventService.V3_1:
// Copyright...: (c) Schleupen SE namespace Schleupen.AS.MT.BIB.Benutzerkonten.BuecherAusgeliehenEvent.V3_1; using System.Diagnostics.CodeAnalysis; using System.ServiceModel; using System.Transactions; using Schleupen.AS.MT.BIB.Benutzerkonten.BuecherAusgeliehenEventService.V3_1; [ServiceBehavior(IncludeExceptionDetailInFaults = true, TransactionIsolationLevel = IsolationLevel.ReadCommitted)] [SuppressMessage("Microsoft.Naming", "CA1724:TypeNamesShouldNotMatchNamespaces", Justification = "Ist hier OK.")] public class BuecherAusgeliehenEventService : IBuecherAusgeliehenEventService { [OperationBehavior(TransactionScopeRequired = true)] public RaisedResponse Raised(RaisedNotification request) { return new RaisedResponse(); } }
Sollte die Registrierung des Events im RabbitMQ nicht erfolgen, dann fehlt entweder
- ein Aufruf des Powershell-Cmdlets
Update-CSMessagingArtifacts
oder - in der PackageMetadata.xml des nuget-Packages (das im Ale-Package enthalten ist) fehlt das Tag
<IsSubscriber>true</IsSubscriber>
<ServiceImplementation>
<Interfaces>
<Interface>Schleupen.AS.MT.BIB.Benutzerkonten.BuecherAusgeliehenEventService_3.1</Interface>
...
<IsSubscriber>true</IsSubscriber>
...
</ServiceImplemenation>
Man kann das einfach lösen, indem man das C#-Attribut IsSubscriber
wie folgt ergänzt:
[IsSubscriber] ... public class BuecherAusgeliehenEventService : IBuecherAusgeliehenEventService { ... }
Das ist aber nur in sehr seltenen Fällen notwendig!
3. Um den erfolgreichen Service-Aufruf nachvollziehen zu können, schreiben wir, bei der Ausführung, eine Nachricht ins Log. Dafür lassen wir uns eine Instanz von Schleupen.CS.PI.SB.Diagnostics.Logging.ILogger
im Konstruktor injizieren.
public class BuecherAusgeliehenEventService : IBuecherAusgeliehenEventService { private readonly ILogger<BuecherAusgeliehenEventService> logger; public BuecherAusgeliehenEventService(ILogger<BuecherAusgeliehenEventService> logger) { this.logger = logger ?? throw new ArgumentNullException(nameof(logger)); } public RaisedResponse Raised(RaisedNotification request) { logger.LogInformation("BuecherAusgeliehenEventService.Raised - Start"); logger.LogInformation("BuecherAusgeliehenEventService.Raised - End"); return new RaisedResponse(); } }
4. Nach dem Erstellen der Solution befindet sich im Pfad \Build\Debug\net48\Chocolatey das Nuget-Paket schleupen.as.mt.bib.subscription.test.services.3.40.1.0.nupkg.
Die Versionsnummer kann abweichen.
Das Paket kann mittels 'Install-CSPackageRemotely' von Host in die VM installiert werden:
Install-CSPackageRemotely "D:\Dev\_\AS.MT.BIB\Build\Debug\net48\Chocolatey\schleupen.as.mt.bib.subscription.test.services.3.40.1.0.nupkg"
Wenn man sich im Visual Studio der Solution "AS.MT.BIB_Bibliotheksverwaltung.sln" befindet, kann man sich den Pfad nach Eingabe von "Install-CSPackageRemotely" per TAB generieren lassen:
Nach dem ersten Deployment muss der Windows-Dienst Schleupen Business Event Dispatcher Service manuell neu gestartet werden.
Außerdem muss das Log-Level Information temporär aktiviert werden:
Set-CSDiagnosticsConfiguration -LogLevel Information -Components @("Schleupen.AS.MT.BIB.Subscription.Test.Services") -Duration ([TimeSpan]::FromHours(1)) -Targets DiagnosticProtocol,File
Die Log-Dateien sind im Pfad C:\ProgramData\Schleupen.CS\PI.Diagnostics\Schleupen.AS.MT.BIB auf dem Schleupen.CS-Host (= VM) zu finden.
5. Im nächsten Schritt rufen wir den Service auf, bei dem auch das soeben implementierte Event ausgelöst wird. Dazu nutzen wir Sloap und fügen den Service Schleupen.AS.MT.BIB.Benutzerkonten.BuecherAusgeliehenActivityService_3.1 hinzu. Über die Service-Methode Execute
lösen wir das Business Event aus. Die BuchIds kannst du wie im vorherigen Kapitel ermitteln!
Nun ist ein Log-Eintrag unter C:\ProgramData\Schleupen.CS\PI.Diagnostics\Schleupen.AS.MT.BIB.Subscription.Test.Services entstanden.
6. Auch hier müssen wir die Daten wieder zurücksetzen. Daher im folgenden Skript die Ids ersetzen. Die BuchId
haben wir im Request mitgegeben und die AusleiheId
steht im Request des Service-Aufrufs.
UPDATE mt_bib.Buch SET AusgeliehenAm = NULL WHERE Id = '<BuchId einsetzen>'; DELETE FROM mt_bib.Ausleihe WHERE Id = '<AusleiheId einsetzen>';
Um etwaige Fehler zu analysieren kannst du auch direkt den Subscriber-Service können aufrufen. Dazu nutzen wir wieder Sloap und fügen den Service Schleupen.AS.MT.BIB.Benutzerkonten.BuecherAusgeliehenEventService_3.1 hinzu. Über die Service-Methode Raised
lösen wir das Business Event dann manuell aus.
Das Ergebnis der Implementierung kannst du im TFS einsehen:
https://tfsprod.schleupen-ag.de/tfs/DefaultCollection/CS3/_git/cs-Schleupen.AS.MT.BIB?path=%2F&version=GBfeature%2FDevCampus-BusinessEventsImpl&_a=contents