RelSysSS15 P2

Aus Verteilte Systeme - Wiki
Wechseln zu: Navigation, Suche

Aufgabe

Konzeption und Entwicklung eines verlässlichen Systems in Java mit WebServices und Zookeeper.

Einleitung

Moderne Systeme sind in der Regel verteilt. Die Erwartung, dass ein solches System sich zuverlässig verhält, kann nicht immer erfüllt werden. Viele externe Faktoren können das System beeinflussen, z. B. die Kommunikation wird getrennt, ein externes System ist fehlerhaft, oder ähnliches. Ein verlässliches System sollte in der Lage sein, Fehler zu erkennen und zu beheben, bzw. diese für den Client zu maskieren. Dies erfordert eine dafür optimierte Architektur. Bereits in der Konzeption werden mögliche Fehlerquellen analysiert und das System wird auf sie vorbereitet. Das Ziel des Projekts ist es, ein System zu konzeptionieren und zu entwickeln, das verlässliche Dienste bereitstellt. Das Projekt besteht aus einem Frontend und mehreren redundanten WebServices. Das Frontend kann die von den WebServices bereitgestellten Funktionen nutzen. Ein WebService kann auch die Dienste eines anderen WebServices nutzen.

Grundlagen

In diesem Bereich werden die Grundlagen zur Implementierung des Projekts vorgestellt, sowie die Methodiken zur Quantifizierung der Verfügbarkeit.

Zookeeper

Apache Zookeeper wird eingesetzt um die Konfiguration für die WebServices bereitzustellen. Auch der Zustand jedes einzelnen WebServices wird vom Zookeeper überwacht. Zookeeper ist ein Open Source Top Level Apache Projekt und basiert ursprünglich auf Apache Hadoop. Die Aufgabe des Zookeepers ist die Bereitstellung eines Konfigurations- und Synchronisationsdienstes, sowie der Naming Registry.

Zookeeper bietet eine baumähnliche Verzeichnisstruktur. Die Knoten oder, in der Zookeeper-Bezeichnung, zNodes können mit Daten gefüllt werden.

Statt die Daten oder die Struktur in gleichen Zeitabständen abzufragen, bietet Zookeeper die Möglichkeit den Client als Watcher bei den Zookeeper-Server anzumelden. So wird der Watcher über eine Callback-Methode über die Zustandsänderung informiert. Diese Vorgehensweise reduziert die Kommunikation zwischen den Client und den Server. Folgendes Diagramm stellt beide Vorgehensweisen gegenüber.

RelSysSS15 P2 ZK Callback.svg

Jedes zNode erhält eine Versionsnummer, bei jeder Änderung wird die Versionsnummer erhöht. Wenn die Client-Änderung eine niedrigere Versionsnummer als die von Zookeeper hat, erhält der Client eine Exception (Optimistic Locking). Das folgende Diagramm demostriert dieses Verhalten, bei zwei Client die nicht als Watcher angemeldet sind.

RelSysSS15 P2 ZK OptimisticLocking.svg

Das Projekt setzt den Zookeeper in Quorummodus um. Das bedeutet, dass mehrere Zookeeper Instanzen die Daten replizieren. Der Zookeeper übernimmt die Synchronisation der Daten für jedes einzelne Quorummitglied.


Java-Testclient

Ein Java Client wurde implementiert. Dieser wurde mit Hilfe des Tutorials aus der Zookeeper-Projektwebsite entwickelt. Der Client beobachtet einen zNode. Bei einer Änderung wird der Inhalt in die Konsole ausgegeben.

Datei:ZookeeperClient.tar.gz

Aufruf:

java -jar ZookeeperClient.jar rs2-02.vs.cs.hs-rm.de:2181,rs2@rs2-03.vs.cs.hs-rm.de:2181 /workers

Fehlerbaumanalyse

Die Fehlerbaumanalyse ist ein Verfahren um die Verfügbarkeit (bzw. die Unverfügbarkeit) eines Systems zu quantifizieren. Dabei nutzt sie eine baumähnliche graphische Darstellung, in der die Komponentenfehler als Blätter dargestellt werden (Fehlerorientiert). Die Fehlerwahrscheinlichkeit oder Ausfallwahrscheinlichkeit ist dabei stetig, meistens wird sie aus Katalogen entnommen. Das Verfahren wurde von Bell Telephone Lab. im Jahr 1961 entwickelt und findet meistens im Bereich der kritischen Systeme Gebrauch. (Unter anderem in der Luft-, Raumfahrttechnik und Nuklearindustrie).

Verfahren

Der erste Schritt sind die Rahmen des zu untersuchenden Fehlers zu definieren, wie die Umgebung, in der das System läuft, und der Grad der Gefährdung, der durch das Eintreten des Fehlers generiert wird. Das Eintreten des zu untersuchenden Fehlers wird als Top-Ereignis definiert und als Baumwurzel im Baum dargestellt. Einzelne Ereignisse, die zum Fehler führen könnten werden mit den erlaubten Symbolen verknüpft.

Symbol Gatter Beschreibung
RelSysSS15 P2 and.png Und Gatter Alle Ereignisse müssen vorliegen
RelSysSS15 P2 or.png Oder Gatter Mindestens eine Ursache muss vorliegen
RelSysSS15 P2 block.png Block Gatter Nebenbedingung und die Ursache müssen vorliegen
RelSysSS15 P2 Zwischenereignis.png Zwischenereignis besteht aus einer Kombination von Unterereignissen
RelSysSS15 P2 Basis-Ereignis.png Basis-Ereignis besteht aus einer Kombination von Unterereignissen
RelSysSS15 P2 nichtuntersuchtes.png nicht untersuchtes Ereignis notwendige Informationen sind (noch) nicht vorhanden
RelSysSS15 P2 transfer.png Transfer Symbol verbindet Fehlerbäume

Das Quantifizieren der Ausfallwahrscheinlichkeit geschieht, indem aus der Fehlerbaumanalyse gewonnene boolesche Formel durch folgende Formeln ersetzt wird:

Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle W_f(K_1 ∧ K_2) = X_1 * X_2}

Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle W_f(K_1 ∨ K_2) = X_1 + X_2 - X_1 * X_2}

mit Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle X_1 = W_f(K_1) } Fehlerwahrscheinlichkeit von Komponente 1

Die Verfügbarkeit eines Systems ist die Abwesenheit von Fehlern, oder in der Wahrscheinlichkeitsrechnung das 1er-Kompliment der Fehlerwahrscheinlichkeit

Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle W_v = 1 - W_f}

Beispiel

Folgendes Diagramm stellt ein System dar. Das System besteht aus 4 Komponenten und ist verfügbar, wenn eine Leitung durch die verfügbaren Komponenten von links nach rechts existiert.

RelSysSS15 P2 SchaltungDiagram.svg

Der Ausfall des oben dargestellten Systems wird mittels der Fehlerbaumanalyse untersucht.

RelSysSS15 P2 FehlerBaum.svg

Das System ist defekt, wenn

  • Komponenten 1, 2 und 4 defekt sind oder
  • Komponenten 3 und 4 defekt sind

Als Formel dargestellt:

Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle (W_f(K_1) ∧ W_f(K_2) ∧ W_f(K_4)) ∨ (W_f(K_3) ∧ W_f(K_4)) = ((W_f(K_1) ∧ W_f(K_2)) ∨ W_f(K_3)) ∧ W_f(K_4)}

Somit beträgt die Fehlerwahrscheinlichkeit des gesamten Systems

Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle X_S =(( X_1 ∧ X_2 )∨ X_3 )∧ X_4} Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle =(( X_1 ∗ X_2 )+ X_3 − X_1 ∗ X_2 ∗ X_3 )∗ X_4} Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle = X_1 ∗ X_2 ∗(1− X_3)∗ X_4 + X_3 ∗ X_4}

Markov-Ketten (1. Ordnung)

Eine Markov-Kette 1. Ordnung (nach Andrei Andrejewitsch Markow) ist ein stochastischer Prozess, der zu diskreten Zeitpunkten Elemente aus einer endlichen Zustandsmenge zufällig produziert. Dieses Verfahren ermöglicht die Ermittlung von zukünftigen Zuständen mit geringeren Kenntnissen über die Vorgeschichte eines Systems bzw. nur der aktuelle Zustand ist notwendig. Die bedingte Übergangswahrscheinlichkeit zwischen den Zuständen ist dabei stetig.

Sei Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle S} eine endliche Menge von Zuständen Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle S = \{s_1, s_2, ...,s_n\}} und Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle X_t} eine Variable, die ein Zustand von Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle S} zum diskreten Zeitpunkt Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle t} annehmen kann Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle X_t=s_i} mit n, t, i ∈ Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle \mathcal{N}}

Dann gilt Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle P( X_t = s_{jt} ∣ X_{t−1} = s_{jt−1} , X_{t−2} = s_{jt−2} , ... , X_0 =s_{j0} ) = P( X_t = s_{jt} ∣ X_{t−1} = s_{jt−1})}

Die Wahrscheinlichkeit, dass der Zustand Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle X_t} generiert wird ist nur durch Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle X_{t-1}} bedingt. Die Darstellung der Markov-Ketten kann als Graph und/oder als Matrix dargestellt werden.

Übergangsmatrix

Für die quadratische Übergangsmatrix Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle M} mit Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle M(t)=( p_{ij}(t)); s_i, s_j ∈ S} gilt

Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle p_{ij}(t)=P( X_t =s_j ∣X_{t−1} = s_i )} mit Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle i , j ∈ \{1, 2,.... , anz (S)\} }

Eigenschaften

  • Die Summe der Werte einer Reihe ergeben 1.
 Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle \sum_{j=1}^{anz(S)} p_{ij}=1}

  • Die unendliche Multiplikation mit sich selbst, ergibt die Grenzmatrix G. Die Spalten der Matrix G konverigieren zu der stationären Verteilung
 Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle \lim_{n \to \infty}M^n=G}
 mit Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle M^n=\underbrace{M*M*...*M}_{n-mal}}

  • Die stationäre Verteilung kann auch durch Lösungs des linearen Gleichungssystems errechnet werden.
 Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle M*\overrightarrow{x}=\overrightarrow{x}}

Beispiel

Dasselbe System der Fehlerbaumanalyse wird betrachtet. Das System hat 4 Komponenten, jede einzelne Komponente kann 2 Zustände haben, nämlich ok oder defekt. Das bedeutet, dass das ganze System insgesamt 16 Zustände annehmen kann.

K4 Verfügbar K3 Verfügbar K2 Verfügbar K1 Verfügbar Zustand Wortdarstellung
J J J J s1 0000
J J J N s2 0001
J J N J s3 0010
J J N N s4 0011
J N J J s5 0100
J N J N s6 0101
J N N J s7 0110
J N N N s8 0111
N J J J s9 1000
N J J N s10 1001
N J N J s11 1010
N J N N s12 1011
N N J J s13 1100
N N J N s14 1101
N N N J s15 1110
N N N N s16 1111

Für Vorführungszwecke werden nur die ersten 4 Zustände betrachtet.

RelSysSS15 P2 markov simple.svg

Mit

 l_1 = Ausfallrate der Komponenten K1
 l_2 = Ausfallrate der Komponenten K2

und

 m_1 = Reparaturrate der Komponenten K1
 m_2 = Reparaturrate der Komponenten K2

Eine ausführliche Definition von Reparatur- und Ausfallrate kann unter Link gefunden werden.

Die Matrixdarstellung (Übergangsmatrix) für den oberen Graphen sieht wie folgt aus

Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle M = \begin{pmatrix} 1-(l\_1+l\_2) & l\_1 & l\_2 & 0 \\ m\_1 & 1-(l\_2+m\_1) & 0 & l\_2 \\ m\_2 & 0 & 1-(l\_2+m\_1) & l\_1 \\ 0 & m\_2 & m\_1 & 1-(m\_1+m\_2) \\ \end{pmatrix} }

  • Zustand s1 wird vom Zustand s1 mit einer Wahrscheinlichkeit von Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle 1-(l\_1+l\_2)} erreicht
  • Zustand s2 wird vom Zustand s1 mit einer Wahrscheinlichkeit von Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle l\_1} erreicht
  • Zustand s3 wird vom Zustand s1 mit einer Wahrscheinlichkeit von Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle l\_2} erreicht
  • Zustand s4 wird vom Zustand s1 mit einer Wahrscheinlichkeit von Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle 0} erreicht
  • Zustand s1 wird vom Zustand s2 mit einer Wahrscheinlichkeit von Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle m\_1} erreicht
  • ...

Umgebung

Virtuelle Maschinen

Folgende virtuelle Maschinen sind bereitgestellt:

rs2-01.vs.cs.hs-rm.de
rs2-02.vs.cs.hs-rm.de
rs2-03.vs.cs.hs-rm.de
rs2-04.vs.cs.hs-rm.de
rs2-05.vs.cs.hs-rm.de

Alle VMs jeweils mit 1GB Hauptspeicher, 5 GB Festplattenplatz, Debian Server OS und Java 7. Die /etc/hosts-Datei wurde umkonfiguriert, sodass die VMs selbst ihre URLs über das externe Interface ansprechen können.

Zookeeper-Umgebung

Zookeeper wird in Quorum-Modus eingerichtet und folgende Konfiguration wurde verteilt.

tickTime=2000
dataDir=datadir
clientPort=2181
initLimit=5
syncLimit=2
server.1=rs2-01.vs.cs.hs-rm.de:2888:3888
server.2=rs2-02.vs.cs.hs-rm.de:2888:3888
server.3=rs2-03.vs.cs.hs-rm.de:2888:3888
server.4=rs2-04.vs.cs.hs-rm.de:2888:3888
server.5=rs2-05.vs.cs.hs-rm.de:2888:3888

Es ist wichtig dass alle Quorum-Mitglieder dieselbe Konfiguration benutzen. Dazu war es noch nötig ein File Names myid im dataDir-Verzeichnis anzulegen, sodass der Zookeeper seinen eigenen Host kennt. Das File enthält ein Integer mit der ServerId. E.G.: Auf der Maschine rs2-01.vs.cs.hs-rm.de liegt unter dem dataDir eine myid-Datei mit Inhalt 1. Auf der Maschine rs2-02.vs.cs.hs-rm.de liegt unter dem dataDir eine myid-Datei mit Inhalt 2. usw.

Der Port 2181 ist der Port, den die Clients benutzen um sich mit dem Zookeeper zu verbinden. Port 2888 wird für die User-Transactions eingesetzt. Port 3888 wird vom Zookeeper für die Wahl des Leaders (LEADER/FOLLOWER) benutzt.

Sind die Quorum-Mitglieder konfiguriert, kann der Zookeeper auf alle VMs mit Hilfe von seinem Startskript (bin/zkServer.sh start) gestartet werden. Hierfür wurde ein Skript erstellt, indem alle Startskripte von den verschiedenen Zookeeperinstallationen ausgeführt werden.

In den Logs des Zookeepers (zookeeper.out) kann die Leader-Auswahl verfolgt werden.

WebServices

Im Rahmen des Projekts werden zwei verschiedenen WebService-Arten implementiert und in jeder virtuellen Maschine installiert.

RelSysSS15 P2 Umgebung.svg

Problemanalyse

Das Ziel des Projekts ist die Konzeption und Entwicklung eines verlässlichen Systems. Das bedeutet, dass das zu implementierenden System in der Lage sein soll, Fehler erkennen und korrigieren zu können.

Das System besteht aus einem Web-Frontend (Client) und mehreren redundanten WebServices. Die Redundanz ist unter einer strukturellen funktionsbeteiligten Redundanz unterzuordnen; d.h., dass die WebServices mehrfach präsent sind und die Clientanfragen von allen präsenten WebServices verarbeitet werden. Die WebServices laufen auf eine eigene JVM und sind isoliert, sodass sie einzeln an- und abgeschaltet werden können, ohne dass das gesamte System heruntergefahren werden muss. Das Ziel dieser Vorgehensweise ist es, bei einem Ausfall einer Komponente bzw. eines WebServices, den kompletten Ausfall zu verhindern. Ein hierfür erdenkliches Szenario ist z.B. die Durchführung eines Systemupdates ohne den bereitgestellten Dienst zu stoppen.

Folgende Fehlerarten werden behandelt:

  • Ausfall einer Komponente: Der Ausfall einer Komponente wird vom System maskiert; d.h., dass der Client von dem Ausfall nichts mitkriegen soll
  • Korrektur falscher Ergebnissen: Falsche Ergebnisse werden vom System korrigiert, die Strategie wie dies geschieht, soll konfigurierbar sein
  • Zeitverzögerung: Die Antwortlatenz soll stets niedrig gehalten werden

Konzeption

Das System besteht aus einer Weboberfläche und mehreren WebServices. Gleichartige WebServices werden in Gruppen zusammengefasst; alle Gruppenmitglieder kennen den Status anderer Gruppenmitgliedern. Aus einer Gruppe wird mittels Zookeeper ein Primary gewählt, aller anderen Gruppenmitglieder sind Secondaries.

Für folgende Aufgaben ist der Primary einer Gruppe zuständig:

  • Client-Requests entgegennehmen: Die Clients kennen nur den Primary; d.h., dass sie ihre Requests an ihm versenden und dass sie ihre Responses von ihm bekommen
  • Weiterleitung der Client-Requests: Der Primary leitet die Client-Requests an den Secondaries weiter, dann sammelt er die Responses und evaluiert sie. Dies geschieht mittels einer „Calculation Strategy“, die mit dem Zookeeper zur Laufzeit verändert werden kann.
RelSysSS15 P2 WorkFlow.svg

Fehlerkorrektur

Im diesen Abschnitt werden Methoden und Vorgehensweisen vorgestellt, die das System implementiert, um die in der Problemanalyse genannten Fehler zu korrigieren oder umzugehen.

Ausfall einer Komponente

Beim Ausfall einer Komponente sind zwei Fälle zu unterscheiden, nämlich der Ausfall eines Secondaries und der Ausfall des Primarys.

Ausfall eines Secondarys

Tritt ein Secondary-Ausfall vor, werden keine weiteren Anfragen an diesen weitergeleitet, indem das nicht erreichbare WebService aus der Gruppe exkludiert wird. Alle Gruppenmitglieder werden über die Zustandsänderung informiert.

RelSysSS15 P2 WorkerDown.svg
  1. Der Client sendet seine Anfrage an den Primary, dieser leitet die Anfragen an die Secondaries weiter, anschließend evaluiert der Primary die Antworten der Secondaries und sendet die bereinigte Antwort an den Client.
  2. Ein Secondary fällt aus; Zookeeper sendet diese Information an alle Gruppenmitglieder. Der Secondary wird aus der Gruppe entfernt.
  3. Bei den nächsten Client-Anfragen leitet der Primary die Anfragen an diesen nicht weiter.

Findet der Secondary-Ausfall während der Verarbeitung eines Request statt, erhält der Primary eine SocketException. Der Primary, ignoriert diese Exception und die Antwort aller anderen Secondaries werden evaluiert.

Ausfall des Primarys

Beim Ausfall des Primarys wird aus der Gruppe ein neuer Primary ausgewählt. Dieser übernimmt die Aufgaben der Weiterleitung und Sammlung der Secondary-Ergebnisse. Da der Client über eine IP oder eine URL das WebService aufruft, muss ein Interceptor auf der Clientseite implementiert werden. Der Interceptor erhält vom Zookeeper die Adresse des aktuellen Primarys und lenkt den Request an den neuen Primary weiter.

RelSysSS15 P2 PrimaryDown.svg

Findet ein Ausfall des Primarys während der Verarbeitung eines Request statt, erhält der WebService-Client eine SocketException. Dieser sendet dann sein Request erneut, nachdem er ein konfiguriertes Zeitintervall wartet; das kann der Client mehrmals ausführen, bis er eine konfigurierte Grenze an Versuche erreicht hat.

Korrektur falscher Ergebnissen

Der Primary nimmt die Clientanfragen entgegen und leitet sie an die Secondaries weiter. Die Ergebnisse der Secondaries werden gesammelt und ausgewertet. Wie sie ausgewertet werden, kann mithilfe vom Zookeeper konfiguriert werden. Dies geschieht während der Laufzeit und benötigt keinen Neustart der Webservices. Folgende „Calculation Strategies“ werden vom System unterstützt:

  • AVERAGE: Aus den Ergebnisse der Secondaries wird ein Mittelwert errechnet.
  • MAJORITY: Die verschiedenen Ergebnisse der Secondaries werden gesammelt und gezählt. Das Ergebnis mit der größten Anzahl wird an den Client zurückgegeben
  • FIRST: Das erste Ergebnis, das von den Secondaries kommt, wird zurückgegeben

Zeitverzögerung

Die Antwortlatenz soll möglichst niedrig gehalten werden. Um dies zu ermöglichen, wird ein Response-Timeout vorkonfiguriert. Die Secondaries, die keine Antwort in dieser Zeitspanne liefern, werden ignoriert und ihre Ergebnisse werden nicht in die Kalkulation einfließen. Für Testzwecke werden die WebServices eine konfigurierte Zeitspanne abwarten. Diese Zeitspannen sind mittels Zookeeper anpassbar.

Architektur

Für Vorführungszwecke werden die WebServices einfache mathematische Operationen zur Verfügung stellen; nämlich Summe und Multiplikation. Subtraktion und Division sind durch die Inversen der einzelnen Parameter gegeben.

E.G.Substraktion:

Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle 4 - 5 = 4 + (-5)}

E.G. Division:

Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle 4 / 5 = 4 * (1 / 5)}

Die Umwandlung der Parameter in den Inversen erledigt der Parser. Dieser ist in der Lage auch mit Klammer umzugehen, dabei sind längere Ausdrücke auch möglich.

E.G:

Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle 1 + 2 * 3 + (4 / ( 5 + 1))}

Jedes einzelne Paar bildet einen WebService Aufruf. Um das zu ermöglichen wurden zwei Bibliotheken entwickelt:

  • WebService Client
  • WebService API


WebServiceClient

Die WebServiceClient-Bibliothek enthält die Client-Implementierungen für die Dienstaufrufe. Die erste Version wurde mit dem JDK-Tool "wsimport" generiert, indem aus der WSDL Klassen für den Aufruf generiert worden sind. Dazu wurde ein Handler für das Loggen der Nachrichten implementiert. Die Endpoint-Adresse sollte aber zur Laufzeit bzw. kurz vor dem Senden ausgetauscht werden. Das wurde mithilfe von Interceptors erreicht. Da diese Funktionalität nicht im JDK7 enthalten ist, wurde die Bibliothek Apache CXF eingebunden. Die Bibliothek Apache CFX bietet eine Reihe von Funktionen und Erweiterung für die Realisierung von WebServices und ist für die Implementierung (fast) transparent. Die Einbindung der Interceptors wird konfiguriert, indem die Konfigurationsdatei „cfx.xml“ erstellt wurde. Diese kann je nach gewünschtem Feature modifiziert werden. Die Konfigurationsdatei ist in der Spring-Form strukturiert, da Apache CFX Spring benutzt, um die Datei einzulesen und ihre eigene Beans zu initialisieren. Apache CFX bietet eigene Interceptors für das Loggen an und somit wurde die eigene Implementierung irrelevant.

Folgende Interceptors sind für die Clientimplementierung wichtig:

  • LoggingInInterceptor, LoggingOutInterceptor für das Logging Feature
  • ZookeeperEndPointSelectorInterceptor für das Wechseln der Endpoint Addresse Feature

Das ZookeeperEndPointSelectorInterceptor ist eine eigene Interceptor-Implementierung und ist zuständig für das Abfragen der aktuellen Primary-Adresse. Diese Maßnahme maskiert einen Primary-Ausfall vor dem Aufruf der WebServices. Geschieht dies während der Verarbeitung einer Anfrage, erhält der Client eine SocketException. Apache CFX bietet die Möglichkeit ein Retry-Feature zu konfigurieren. Der Ausfall wäre somit transparent für die Client-Implementierung, dieses Feature kollidiert aber mit dem Konzept ein Interceptor einzusetzen, um die aktuelle Primary-Adresse abzufragen. Das Retry-Feature erwartet eine Liste von Endpunkten, die er nacheinander aufzurufen versucht. Aus diesem Grund wurde der Client modifiziert. Nachdem der Client die SocketException erhält, wartet der Client ein konfiguriertes Zeitintervall ab und sendet erneut seine Anfrage. Wie oft diese Vorgehensweise durchgeführt wird ist konfigurierbar.

WebService API

Das WebService API ist die Hauptbibliothek für die Implementierung der einzelnen WebServices. Es bietet abstrakte Klassen und Templates, sowie die Zookeeper-Funktionalitäten, die von den verschiedenen WebServices-Implementierungen um Spezifika erweitert werden.

Beim Starten eines WebServices werden im Zookeeper folgende Pfade angelegt:

/relsysp2/[OperationName]
+ /group
+ /primary
+ /strategy

Die Zookeeper-Bezeichnung für die Knoten lautet zNode. Beim Anlegen eines zNodes wird entschieden, ob nach Abmeldung des Clients das zNode bestehen bleiben soll („Persistent“) oder ob das zNode gelöscht werden soll („Ephemeral“). Über das KeepAlive-Verfahren erkennt das Quorum, welche Zookeeper-Clients noch verfügbar sind. Erhält das Quorum kein Signal über eine bestimmte Zeit, zählt er als "Abgemeldet" und die von ihm erstellten Ephemeral zNodes werden samt Inhalt entfernt.

  1. /relsysp2/[OperationName] Der Hauptknoten besteht aus der Projektname und dem Name der Operation, die von den WebServices angeboten werden. BSP: Für die Summe WebServices würde der Pfad /relsysp2/Sum lauten.
  2. /relsysp2/[OperationName]/group Das Znode ist Persistent aber die darunter existierende zNodes sind als „Ephemeral“ deklariert. Die zNode-Bezeichnung ist in der Form [host]_[port]_[sequentialNumber] formatiert; dazu enthält das zNode die Konfiguration des WebServices. Die Konfiguration des WebServices ist in JSON eingetragen und erhält die Endpoint-Adresse und, für Testzwecke, ein WaitTime- und Faultparameter. Die Gson-Bibliothek wird eingesetzt um Java Objekte in JSON zu konvertieren und vice versa. Alle WebServices überwachen den Inhalt ihres eigenen zNodes und ob unter dem group-zNode neue zNodes hinzukommen sind oder welche gelöscht werden.
  3. /relsysp2/[OperationName]/primary Das zNode ist als „ephemeral“ definiert und enthält den Pfad zur Konfiguration des Primarys. Der Knoten wird von den Webservices überwacht. Ist dieser Knoten nicht vorhanden, versuchen alle WebServices einer Gruppe ihren eigenen Pfad einzutragen. Der Zookeeper garantiert, dass dies nur einem WebService gelingt; alle andere bekommen eine Exception mit dem Grund, dass das zNode bereit existiert.
  4. /relsysp2/[OperationName]/strategy Dieses zNode ist permanent und enthält den Namen der gültige Calculation Strategy. Alle Gruppenmitglieder überwachen den Inhalt dieses zNodes.

Design des Primarys

Ist ein WebService als primary deklariert, nimmt er die Client Aufrufe entgegen und, wenn Secondaries angemeldet sind, leitet er diese an den Secondaries weiter, sonst rechnet der Primary selbst. Das geschieht, indem die aktuelle Liste mit den Adressen der Secondaries an der Calculation Strategy weitergeleitet wird. Welche Calculation Strategy eingesetzt wird, kann mit Hilfe des Zookeepers konfiguriert werden. Eine Factory erstellt eine Calculation Strategy-Instanz pro Client-Anfrage. Die Anfrage an den Secondaries ist dabei parallel, indem ein ThreadPool gestartet wird und Future-Objekte für die Anfragen generiert werden. Die Majority- und Average-Strategien sammeln die Resultate der Future-Objekte, um sie anschließend zu evaluieren. Die First-Strategie verfolgt eine andere Vorgehensweise; für diese ist nur das erste Ergebnis von Nutzen. Das Observer-Pattern wird hierfür umgesetzt. Die Calculation Strategy ist der Observer und die Callables, die im den Future-Objekte enthalten sind, sind die Observable-Objekte. Ist ein Secondary mit seiner Berechnung fertig, versendet dieser eine Notify-Nachricht mit seinem Ergebnis an die Calculation Strategy Instanz. Dabei wartet die Calculation Strategy bis eine Nachricht ankommt. Die Nachrichten müssen synchronisiert werden, da das erste Ergebnis in der Calculation Strategy gehalten wird und nicht von neu ankommenden Nachrichten überschrieben werden soll. Für die Weiterleitung wurde kein weiteres Interface implementiert. Das heißt, dass der Primary ein WebService-Client nutzt, um die Secondaries aufzurufen. Somit besteht eine Abhängigkeit zwischen der WebService API Bibliothek und der WebServiceClient Bibliothek.

WebService Implementierungen

Die WebService Implementierungen erweitern das WebService API um zwei Klassen, eine mit der speziellen Operation, die das WebService durchführen soll und eine die, die WebService-Klasse weiterreicht. Das WebService API generiert dann mittels des Factory-Patterns eine Instanz die von dem Executor gestartet wird. Zusätzlich zu den zwei Klassen, erhalten die Implementierungen die Konfiguration für den Logger und für die Apache CFX Beans.

WebClient

Das WebClient ist das Frontend für das Projekt und ist mit JSF und Primefaces implementiert. Es besteht aus zwei Seiten:

  • /pages/home.jsf Diese Seite nimmt die Eingabe der User. Das Bean parst aus dem Input eine mathematische Formel, die wiederrum in zwei-Parameter Operationen zerlegt werden, um die WebServices abzufragen.
  • /pages/zkTree.jsf Diese Seite wurde um die Konfiguration der WebServices zu vereinfachen. Es zeigt die aktuelle Zookeeper-Struktur und über eine Eingabe kann der zNode-Inhalt angepasst werden.

RelSysSS15 P2 home.png RelSysSS15 P2 zkTree.png

Klassendiagramm

Folgende Abbildung zeigt die fürs Projekt erstellte Klassen und die Abhängigkeiten zwischen den einzelnen Projekten

RelSysSS15 P2 Classes.png

Achtung: In der Lib. cxf-rt-transports-http-2.7.9.jar gibt es eine Referenz von einer xsd-Datei zu einer anderen xsd-Datei. Der Pfad ist relativ, das führt dazu, dass die referenzierte xsd-Datei nicht gefunden werden kann (Da die jar-Datei in einer jar-Datei liegt.). Nach dem Bauen die Ordner schemas/configuration und schemas/wsdl (https://vasquezgarcia.com/RelSysSS15_P2/schemas/) in die one-jar-Datei kopieren.

Ausführbare Version des Projekts

Unter dem Link kann eine ausführbare Version des Projekts runtergeladen werden.

Mit dem Befehl:

java -jar $JAR (Bsp. ServiceMul-0.0.1-SNAPSHOT.one-jar.jar) $SERVER (Bsp. rs2-01.vs.cs.hs-rm.de) $PORT (Bsp. 8083) $ZKCONN (Bsp. rs2-01.vs.cs.hs-rm.de:2181,rs2-02.vs.cs.hs-rm.de:2181,rs2-03.vs.cs.hs-rm.de:2181,rs2-04.vs.cs.hs-rm.de:2181,rs2-05.vs.cs.hs-rm.de:2181)

wird ein Service gestartet.

Unter ZookeeperTree kann die UI für die Konfiguration der Services aufrufen werden. Der WebClient ist unter diesem Link erreichbar.

Tests

Im diesem Bereich wird der Ausfall einer Komponente protokolliert.

Ausfall eines Secondaries

Der Ausfall eines Secondaries ist für den Client transparent. Man unterscheidet zwischen dem Ausfall während der Verarbeitung und dem Ausfall in Standby Modus.

Ausfall in Standby Modus

Im diesen Fall wird der Secondary (http://rs2-02.vs.cs.hs-rm.de:8082) aus der Gruppe entfernt. Keine weitere Request werden an diesen weitergeleitet.

Client Log

2015-07-29 20:56:59 INFO  org.apache.cxf.service.factory.ReflectionServiceFactoryBean  - Creating Service {http://sumws.reliable.wiesbaden.fh.de/}SumWebServiceService from class de.fh.wiesbaden.reliable.client.SumWebService
2015-07-29 20:57:00 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Outbound Message
---------------------------
ID: 1
Address: http://rs2-01.vs.cs.hs-rm.de:8082
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], Connection=[Keep-Alive], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operation xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><a>1.0</a><b>2.0</b></ns1:operation></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 20:57:01 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Inbound Message
----------------------------
ID: 1
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {content-type=[text/xml;charset=UTF-8], Server=[Jetty(8.1.14.v20131031)], transfer-encoding=[chunked]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operationResponse xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><result>3.0</result></ns1:operationResponse></soap:Body></soap:Envelope>
--------------------------------------

Primary Log

2015-07-29 20:43:12 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - Groupmembers: [
2015-07-29 20:43:12 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-04.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 20:43:12 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-03.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 20:43:12 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-01.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 20:43:12 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-05.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 20:43:12 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-02.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 20:43:12 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - ]
2015-07-29 20:56:34 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - Groupmembers: [
2015-07-29 20:56:34 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-04.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 20:56:34 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-03.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 20:56:34 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-01.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 20:56:34 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-05.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 20:56:34 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - ]
2015-07-29 20:57:00 INFO  org.apache.cxf.services.ServiceSumService.SumWebServicePort.SumWebService  - Inbound Message
----------------------------
ID: 1
Address: http://rs2-01.vs.cs.hs-rm.de:8082/
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml; charset=UTF-8
Headers: {Accept=[*/*], Cache-Control=[no-cache], connection=[keep-alive], Content-Length=[211], content-type=[text/xml; charset=UTF-8], Host=[rs2-01.vs.cs.hs-rm.de:8082], Pragma=[no-cache], SOAPAction=[""], User-Agent=[Apache CXF 2.7.9]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operation xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><a>1.0</a><b>2.0</b></ns1:operation></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 20:57:00 INFO  de.fh.wiesbaden.reliable.calcStrategy.FirstCalculationStrategy  - delegate calculation to http://rs2-04.vs.cs.hs-rm.de:8082/Sum
2015-07-29 20:57:00 INFO  de.fh.wiesbaden.reliable.calcStrategy.FirstCalculationStrategy  - delegate calculation to http://rs2-03.vs.cs.hs-rm.de:8082/Sum
2015-07-29 20:57:00 INFO  de.fh.wiesbaden.reliable.calcStrategy.FirstCalculationStrategy  - delegate calculation to http://rs2-05.vs.cs.hs-rm.de:8082/Sum
2015-07-29 20:57:00 INFO  org.apache.cxf.service.factory.ReflectionServiceFactoryBean  - Creating Service {http://sumws.reliable.wiesbaden.fh.de/}SumWebServiceService from class de.fh.wiesbaden.reliable.client.SumWebService
2015-07-29 20:57:00 INFO  org.apache.cxf.service.factory.ReflectionServiceFactoryBean  - Creating Service {http://sumws.reliable.wiesbaden.fh.de/}SumWebServiceService from class de.fh.wiesbaden.reliable.client.SumWebService
2015-07-29 20:57:00 INFO  org.apache.cxf.service.factory.ReflectionServiceFactoryBean  - Creating Service {http://sumws.reliable.wiesbaden.fh.de/}SumWebServiceService from class de.fh.wiesbaden.reliable.client.SumWebService
2015-07-29 20:57:00 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Outbound Message
---------------------------
ID: 2
Address: http://rs2-05.vs.cs.hs-rm.de:8082/Sum
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], Connection=[Keep-Alive], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operation xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><a>1.0</a><b>2.0</b></ns1:operation></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 20:57:00 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Outbound Message
---------------------------
ID: 3
Address: http://rs2-03.vs.cs.hs-rm.de:8082/Sum
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], Connection=[Keep-Alive], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operation xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><a>1.0</a><b>2.0</b></ns1:operation></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 20:57:00 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Outbound Message
---------------------------
ID: 4
Address: http://rs2-04.vs.cs.hs-rm.de:8082/Sum
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], Connection=[Keep-Alive], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operation xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><a>1.0</a><b>2.0</b></ns1:operation></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 20:57:01 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Inbound Message
----------------------------
ID: 3
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {content-type=[text/xml;charset=UTF-8], Server=[Jetty(8.1.14.v20131031)], transfer-encoding=[chunked]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operationResponse xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><result>3.0</result></ns1:operationResponse></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 20:57:01 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Inbound Message
----------------------------
ID: 4
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {content-type=[text/xml;charset=UTF-8], Server=[Jetty(8.1.14.v20131031)], transfer-encoding=[chunked]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operationResponse xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><result>3.0</result></ns1:operationResponse></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 20:57:01 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Inbound Message
----------------------------
ID: 2
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {content-type=[text/xml;charset=UTF-8], Server=[Jetty(8.1.14.v20131031)], transfer-encoding=[chunked]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operationResponse xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><result>3.0</result></ns1:operationResponse></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 20:57:01 INFO  de.fh.wiesbaden.reliable.calcStrategy.FirstCalculationStrategy  - Answer from http://rs2-04.vs.cs.hs-rm.de:8082/Sum is 3.0
2015-07-29 20:57:01 INFO  de.fh.wiesbaden.reliable.calcStrategy.FirstCalculationStrategy  - Answer from http://rs2-05.vs.cs.hs-rm.de:8082/Sum is 3.0
2015-07-29 20:57:01 INFO  de.fh.wiesbaden.reliable.calcStrategy.FirstCalculationStrategy  - Answer from http://rs2-03.vs.cs.hs-rm.de:8082/Sum is 3.0
2015-07-29 20:57:01 INFO  org.apache.cxf.services.ServiceSumService.SumWebServicePort.SumWebService  - Outbound Message
---------------------------
ID: 1
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml
Headers: {}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operationResponse xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><result>3.0</result></ns1:operationResponse></soap:Body></soap:Envelope>
--------------------------------------

Ausfall während der Verarbeitung

Der Ausfall während der Verarbeitung generiert eine SocketException, diese wird Primary behandelt und ist somit für den Primary transparent. Der Secondary (http://rs2-02.vs.cs.hs-rm.de:8082) wird während seiner Verarbeitung abgeschaltet.

Client Log

2015-07-29 21:12:02 INFO  org.apache.cxf.service.factory.ReflectionServiceFactoryBean  - Creating Service {http://sumws.reliable.wiesbaden.fh.de/}SumWebServiceService from class de.fh.wiesbaden.reliable.client.SumWebService
2015-07-29 21:12:02 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Outbound Message
---------------------------
ID: 2
Address: http://rs2-01.vs.cs.hs-rm.de:8082
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], Connection=[Keep-Alive], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operation xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><a>1.0</a><b>2.0</b></ns1:operation></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:12:07 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Inbound Message
----------------------------
ID: 2
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {content-type=[text/xml;charset=UTF-8], Server=[Jetty(8.1.14.v20131031)], transfer-encoding=[chunked]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operationResponse xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><result>3.0</result></ns1:operationResponse></soap:Body></soap:Envelope>
--------------------------------------

Primary Log

2015-07-29 20:59:45 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - Selected calculation strategy: AverageCalculationStrategy
2015-07-29 21:12:02 INFO  org.apache.cxf.services.ServiceSumService.SumWebServicePort.SumWebService  - Inbound Message
----------------------------
ID: 5
Address: http://rs2-01.vs.cs.hs-rm.de:8082/
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml; charset=UTF-8
Headers: {Accept=[*/*], Cache-Control=[no-cache], connection=[keep-alive], Content-Length=[211], content-type=[text/xml; charset=UTF-8], Host=[rs2-01.vs.cs.hs-rm.de:8082], Pragma=[no-cache], SOAPAction=[""], User-Agent=[Apache CXF 2.7.9]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operation xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><a>1.0</a><b>2.0</b></ns1:operation></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:12:02 INFO  de.fh.wiesbaden.reliable.calcStrategy.AverageCalculationStrategy  - delegate calculation to http://rs2-02.vs.cs.hs-rm.de:8082/Sum
2015-07-29 21:12:02 INFO  de.fh.wiesbaden.reliable.calcStrategy.AverageCalculationStrategy  - delegate calculation to http://rs2-04.vs.cs.hs-rm.de:8082/Sum
2015-07-29 21:12:02 INFO  de.fh.wiesbaden.reliable.calcStrategy.AverageCalculationStrategy  - delegate calculation to http://rs2-03.vs.cs.hs-rm.de:8082/Sum
2015-07-29 21:12:02 INFO  de.fh.wiesbaden.reliable.calcStrategy.AverageCalculationStrategy  - delegate calculation to http://rs2-05.vs.cs.hs-rm.de:8082/Sum
2015-07-29 21:12:02 INFO  org.apache.cxf.service.factory.ReflectionServiceFactoryBean  - Creating Service {http://sumws.reliable.wiesbaden.fh.de/}SumWebServiceService from class de.fh.wiesbaden.reliable.client.SumWebService
2015-07-29 21:12:02 INFO  org.apache.cxf.service.factory.ReflectionServiceFactoryBean  - Creating Service {http://sumws.reliable.wiesbaden.fh.de/}SumWebServiceService from class de.fh.wiesbaden.reliable.client.SumWebService
2015-07-29 21:12:02 INFO  org.apache.cxf.service.factory.ReflectionServiceFactoryBean  - Creating Service {http://sumws.reliable.wiesbaden.fh.de/}SumWebServiceService from class de.fh.wiesbaden.reliable.client.SumWebService
2015-07-29 21:12:02 INFO  org.apache.cxf.service.factory.ReflectionServiceFactoryBean  - Creating Service {http://sumws.reliable.wiesbaden.fh.de/}SumWebServiceService from class de.fh.wiesbaden.reliable.client.SumWebService
2015-07-29 21:12:02 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Outbound Message
---------------------------
ID: 6
Address: http://rs2-04.vs.cs.hs-rm.de:8082/Sum
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], Connection=[Keep-Alive], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operation xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><a>1.0</a><b>2.0</b></ns1:operation></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:12:02 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Outbound Message
---------------------------
ID: 8
Address: http://rs2-02.vs.cs.hs-rm.de:8082/Sum
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], Connection=[Keep-Alive], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operation xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><a>1.0</a><b>2.0</b></ns1:operation></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:12:02 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Outbound Message
---------------------------
ID: 7
Address: http://rs2-03.vs.cs.hs-rm.de:8082/Sum
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], Connection=[Keep-Alive], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operation xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><a>1.0</a><b>2.0</b></ns1:operation></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:12:02 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Outbound Message
---------------------------
ID: 9
Address: http://rs2-05.vs.cs.hs-rm.de:8082/Sum
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], Connection=[Keep-Alive], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operation xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><a>1.0</a><b>2.0</b></ns1:operation></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:12:02 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Inbound Message
----------------------------
ID: 7
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {content-type=[text/xml;charset=UTF-8], Server=[Jetty(8.1.14.v20131031)], transfer-encoding=[chunked]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operationResponse xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><result>3.0</result></ns1:operationResponse></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:12:02 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Inbound Message
----------------------------
ID: 6
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {content-type=[text/xml;charset=UTF-8], Server=[Jetty(8.1.14.v20131031)], transfer-encoding=[chunked]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operationResponse xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><result>3.0</result></ns1:operationResponse></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:12:02 INFO  de.fh.wiesbaden.reliable.calcStrategy.AverageCalculationStrategy  - Answer from http://rs2-03.vs.cs.hs-rm.de:8082/Sum is 3.0
2015-07-29 21:12:02 INFO  de.fh.wiesbaden.reliable.calcStrategy.AverageCalculationStrategy  - Answer from http://rs2-04.vs.cs.hs-rm.de:8082/Sum is 3.0
2015-07-29 21:12:02 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Inbound Message
----------------------------
ID: 9
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {content-type=[text/xml;charset=UTF-8], Server=[Jetty(8.1.14.v20131031)], transfer-encoding=[chunked]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operationResponse xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><result>3.0</result></ns1:operationResponse></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:12:02 INFO  de.fh.wiesbaden.reliable.calcStrategy.AverageCalculationStrategy  - Answer from http://rs2-05.vs.cs.hs-rm.de:8082/Sum is 3.0
2015-07-29 21:12:04 WARN  org.apache.cxf.phase.PhaseInterceptorChain  - Interceptor for {http://sumws.reliable.wiesbaden.fh.de/}SumWebServiceService#{http://sumws.reliable.wiesbaden.fh.de/}operation has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Could not send Message.
	at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64)
	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
	at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:565)
	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:474)
	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:377)
	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:330)
	at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
	at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:135)
	at com.sun.proxy.$Proxy43.operation(Unknown Source)
	at de.fh.wiesbaden.reliable.client.ClientExecutor.operation(ClientExecutor.java:78)
	at de.fh.wiesbaden.reliable.calcStrategy.ServiceCallable.call(ServiceCallable.java:36)
	at de.fh.wiesbaden.reliable.calcStrategy.ServiceCallable.call(ServiceCallable.java:13)
	at java.util.concurrent.FutureTask.run(FutureTask.java:262)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.SocketException: SocketException invoking http://rs2-02.vs.cs.hs-rm.de:8082/Sum: Unexpected end of file from server
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1339)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1323)
	at org.apache.cxf.io.CacheAndWriteOutputStream.postClose(CacheAndWriteOutputStream.java:50)
	at org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:223)
	at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
	at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:628)
	at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
	... 15 more
Caused by: java.net.SocketException: Unexpected end of file from server
	at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:772)
	at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633)
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1324)
	at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468)
	at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.getResponseCode(URLConnectionHTTPConduit.java:266)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1531)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1504)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1310)
	... 20 more
2015-07-29 21:12:04 ERROR de.fh.wiesbaden.reliable.client.ClientExecutor  - 
javax.xml.ws.WebServiceException: Could not send Message.
	at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:146)
	at com.sun.proxy.$Proxy43.operation(Unknown Source)
	at de.fh.wiesbaden.reliable.client.ClientExecutor.operation(ClientExecutor.java:78)
	at de.fh.wiesbaden.reliable.calcStrategy.ServiceCallable.call(ServiceCallable.java:36)
	at de.fh.wiesbaden.reliable.calcStrategy.ServiceCallable.call(ServiceCallable.java:13)
	at java.util.concurrent.FutureTask.run(FutureTask.java:262)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.SocketException: SocketException invoking http://rs2-02.vs.cs.hs-rm.de:8082/Sum: Unexpected end of file from server
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1339)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1323)
	at org.apache.cxf.io.CacheAndWriteOutputStream.postClose(CacheAndWriteOutputStream.java:50)
	at org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:223)
	at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
	at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:628)
	at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
	at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:565)
	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:474)
	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:377)
	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:330)
	at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
	at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:135)
	... 8 more
Caused by: java.net.SocketException: Unexpected end of file from server
	at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:772)
	at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633)
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1324)
	at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468)
	at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.getResponseCode(URLConnectionHTTPConduit.java:266)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1531)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1504)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1310)
	... 20 more
2015-07-29 21:12:07 INFO  de.fh.wiesbaden.reliable.calcStrategy.AverageCalculationStrategy  - Answer from http://rs2-02.vs.cs.hs-rm.de:8082/Sum is null
2015-07-29 21:12:07 INFO  org.apache.cxf.services.ServiceSumService.SumWebServicePort.SumWebService  - Outbound Message
---------------------------
ID: 5
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml
Headers: {}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operationResponse xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><result>3.0</result></ns1:operationResponse></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:12:08 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - Groupmembers: [
2015-07-29 21:12:08 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-04.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 21:12:08 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-03.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 21:12:08 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-01.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 21:12:08 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-05.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 21:12:08 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - ]

Ausfall des Primarys

Sowie bei den Ausfall der Secondaries, wird beim Ausfall des Primarys zwischen dem Ausfall in Standby Modus und dem Ausfall während der Verarbeitung.

Ausfall in Standby Modus

Im diesen Fall wird der Ausfall des Primarys maskiert. Der Interceptor holt sich die Addresse des neuen Primarys bevor der Client seinen Request absendet. Der Primary (http://rs2-01.vs.cs.hs-rm.de:8082) wird durch den neuen Primary (http://rs2-05.vs.cs.hs-rm.de:8082) ersetzt.

Client Log

2015-07-29 21:28:29 INFO  org.apache.cxf.service.factory.ReflectionServiceFactoryBean  - Creating Service {http://sumws.reliable.wiesbaden.fh.de/}SumWebServiceService from class de.fh.wiesbaden.reliable.client.SumWebService
2015-07-29 21:28:29 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Outbound Message
---------------------------
ID: 3
Address: http://rs2-05.vs.cs.hs-rm.de:8082
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], Connection=[Keep-Alive], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operation xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><a>1.0</a><b>2.0</b></ns1:operation></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:28:34 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Inbound Message
----------------------------
ID: 3
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {content-type=[text/xml;charset=UTF-8], Server=[Jetty(8.1.14.v20131031)], transfer-encoding=[chunked]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operationResponse xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><result>3.0</result></ns1:operationResponse></soap:Body></soap:Envelope>
--------------------------------------

Neuer Primary Log

2015-07-29 21:20:16 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - Groupmembers: [
2015-07-29 21:20:16 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-02.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 21:20:16 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-04.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 21:20:16 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-03.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 21:20:16 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-01.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 21:20:16 INFO  de.fh.wiesbaden.reliablehttp://rs2-01.vs.cs.hs-rm.de:8082.sumws.ExecutorSum  - {"address":"http://rs2-05.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 21:20:16 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - ]
2015-07-29 21:28:08 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - rs2-05.vs.cs.hs-rm.de:8082 is Primary
2015-07-29 21:28:08 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - Groupmembers: [
2015-07-29 21:28:08 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-02.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 21:28:08 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-04.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 21:28:08 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-03.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 21:28:08 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-05.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 21:28:08 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - ]
2015-07-29 21:28:29 INFO  org.apache.cxf.services.ServiceSumService.SumWebServicePort.SumWebService  - Inbound Message
----------------------------
ID: 3
Address: http://rs2-05.vs.cs.hs-rm.de:8082/
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml; charset=UTF-8
Headers: {Accept=[*/*], Cache-Control=[no-cache], connection=[keep-alive], Content-Length=[211], content-type=[text/xml; charset=UTF-8], Host=[rs2-05.vs.cs.hs-rm.de:8082], Pragma=[no-cache], SOAPAction=[""], User-Agent=[Apache CXF 2.7.9]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operation xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><a>1.0</a><b>2.0</b></ns1:operation></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:28:29 INFO  de.fh.wiesbaden.reliable.calcStrategy.AverageCalculationStrategy  - delegate calculation to http://rs2-02.vs.cs.hs-rm.de:8082/Sum
2015-07-29 21:28:29 INFO  de.fh.wiesbaden.reliable.calcStrategy.AverageCalculationStrategy  - delegate calculation to http://rs2-04.vs.cs.hs-rm.de:8082/Sum
2015-07-29 21:28:29 INFO  de.fh.wiesbaden.reliable.calcStrategy.AverageCalculationStrategy  - delegate calculation to http://rs2-03.vs.cs.hs-rm.de:8082/Sum
2015-07-29 21:28:29 INFO  org.apache.cxf.service.factory.ReflectionServiceFactoryBean  - Creating Service {http://sumws.reliable.wiesbaden.fh.de/}SumWebServiceService from class de.fh.wiesbaden.reliable.client.SumWebService
2015-07-29 21:28:29 INFO  org.apache.cxf.service.factory.ReflectionServiceFactoryBean  - Creating Service {http://sumws.reliable.wiesbaden.fh.de/}SumWebServiceService from class de.fh.wiesbaden.reliable.client.SumWebService
2015-07-29 21:28:29 INFO  org.apache.cxf.service.factory.ReflectionServiceFactoryBean  - Creating Service {http://sumws.reliable.wiesbaden.fh.de/}SumWebServiceService from class de.fh.wiesbaden.reliable.client.SumWebService
2015-07-29 21:28:29 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Outbound Message
---------------------------
ID: 4
Address: http://rs2-03.vs.cs.hs-rm.de:8082/Sum
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], Connection=[Keep-Alive], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operation xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><a>1.0</a><b>2.0</b></ns1:operation></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:28:29 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Outbound Message
---------------------------
ID: 5
Address: http://rs2-04.vs.cs.hs-rm.de:8082/Sum
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], Connection=[Keep-Alive], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operation xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><a>1.0</a><b>2.0</b></ns1:operation></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:28:29 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Outbound Message
---------------------------
ID: 6
Address: http://rs2-02.vs.cs.hs-rm.de:8082/Sum
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], Connection=[Keep-Alive], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operation xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><a>1.0</a><b>2.0</b></ns1:operation></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:28:29 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Inbound Message
----------------------------
ID: 5http://rs2-01.vs.cs.hs-rm.de:8082
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {content-type=[text/xml;charset=UTF-8], Server=[Jetty(8.1.14.v20131031)], transfer-encoding=[chunked]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operationResponse xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><result>3.0</result></ns1:operationResponse></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:28:29 INFO  de.fh.wiesbaden.reliable.calcStrategy.AverageCalculationStrategy  - Answer from http://rs2-04.vs.cs.hs-rm.de:8082/Sum is 3.0
2015-07-29 21:28:34 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Inbound Message
----------------------------
ID: 4
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {content-type=[text/xml;charset=UTF-8], Server=[Jetty(8.1.14.v20131031)], transfer-encoding=[chunked]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operationResponse xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><result>3.0</result></ns1:operationResponse></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:28:34 INFO  de.fh.wiesbaden.reliable.calcStrategy.AverageCalculationStrategy  - Answer from http://rs2-03.vs.cs.hs-rm.de:8082/Sum is 3.0
2015-07-29 21:28:35 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Inbound Message
----------------------------
ID: 6
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {content-type=[text/xml;charset=UTF-8], Server=[Jetty(8.1.14.v20131031)], transfer-encoding=[chunked]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operationResponse xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><result>3.0</result></ns1:operationResponse></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:28:35 INFO  de.fh.wiesbaden.reliable.calcStrategy.AverageCalculationStrategy  - Answer from http://rs2-02.vs.cs.hs-rm.de:8082/Sum is 3.0
2015-07-29 21:28:35 INFO  org.apache.cxf.services.ServiceSumService.SumWebServicePort.SumWebService  - Outbound Message
---------------------------
ID: 3
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml
Headers: {}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operationResponse xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><result>3.0</result></ns1:operationResponse></soap:Body></soap:Envelope>
--------------------------------------

Ausfall während der Verarbeitung

Fällt der Primary während der Verarbeitung aus, erhält der WebService Client eine SocketException. Die Exception wird nicht weiter gereicht, der WS-Client wartet ein konfiguriertes Zeitintervall und dann sendet den Request erneut. Der Interceptor holt sich die neue Primary Addresse mit Hilfe von Zookeeper. Der Primary (http://rs2-05.vs.cs.hs-rm.de:8082) wird während der Verarbeitung abgeschaltet und wird von (http://rs2-02.vs.cs.hs-rm.de:8082) ersetzt. Im diesen Beispiel hat der WS-Client sein Retry zu schnell ausgeführt und der Interceptor konnte kein Primary im Zookeeper finden. Beim zweiten Versuch findet er die Addresse und der Ablauf läuft wie üblich weiter.

Client Log

2015-07-29 21:52:19 INFO  org.apache.cxf.service.factory.ReflectionServiceFactoryBean  - Creating Service {http://sumws.reliable.wiesbaden.fh.de/}SumWebServiceService from class de.fh.wiesbaden.reliable.client.SumWebService
2015-07-29 21:52:19 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Outbound Message
---------------------------
ID: 4
Address: http://rs2-05.vs.cs.hs-rm.de:8082
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], Connection=[Keep-Alive], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operation xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><a>1.0</a><b>2.0</b></ns1:operation></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:52:22 WARN  org.apache.cxf.phase.PhaseInterceptorChain  - Interceptor for {http://sumws.reliable.wiesbaden.fh.de/}SumWebServiceService#{http://sumws.reliable.wiesbaden.fh.de/}operation has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Could not send Message.
	at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64)
	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
	at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:565)
	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:474)
	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:377)
	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:330)
	at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
	at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:135)
	at com.sun.proxy.$Proxy49.operation(Unknown Source)
	at de.fh.wiesbaden.reliable.client.ClientExecutor.operation(ClientExecutor.java:78)
	at de.fh.wiesbaden.reliable.client.ClientExecutor.operation(ClientExecutor.java:48)
	at de.fh.wiesbaden.reliable.math.MathParser.parseExpression(MathParser.java:66)
	at de.fh.wiesbaden.reliable.math.MathParser.parse(MathParser.java:29)
	at de.fh.wiesbaden.reliable.view.Homepage.calculate(Homepage.java:28)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:247)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:267)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	at javax.faces.component.UICommand.broadcast(UICommand.java:315)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:654)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1521)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1478)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.SocketException: SocketException invoking http://rs2-05.vs.cs.hs-rm.de:8082: Unexpected end of file from server
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1339)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1323)
	at org.apache.cxf.io.CacheAndWriteOutputStream.postClose(CacheAndWriteOutputStream.java:50)
	at org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:223)
	at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
	at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:628)
	at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
	... 50 more
Caused by: java.net.SocketException: Unexpected end of file from server
	at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:772)
	at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633)
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1324)
	at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468)
	at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.getResponseCode(URLConnectionHTTPConduit.java:266)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1531)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1504)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1310)
	... 55 more
2015-07-29 21:52:22 ERROR de.fh.wiesbaden.reliable.client.ClientExecutor  - 
javax.xml.ws.WebServiceException: Could not send Message.
	at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:146)
	at com.sun.proxy.$Proxy49.operation(Unknown Source)
	at de.fh.wiesbaden.reliable.client.ClientExecutor.operation(ClientExecutor.java:78)
	at de.fh.wiesbaden.reliable.client.ClientExecutor.operation(ClientExecutor.java:48)
	at de.fh.wiesbaden.reliable.math.MathParser.parseExpression(MathParser.java:66)
	at de.fh.wiesbaden.reliable.math.MathParser.parse(MathParser.java:29)
	at de.fh.wiesbaden.reliable.view.Homepage.calculate(Homepage.java:28)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:247)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:267)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	at javax.faces.component.UICommand.broadcast(UICommand.java:315)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:654)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1521)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1478)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.SocketException: SocketException invoking http://rs2-05.vs.cs.hs-rm.de:8082: Unexpected end of file from server
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1339)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1323)
	at org.apache.cxf.io.CacheAndWriteOutputStream.postClose(CacheAndWriteOutputStream.java:50)
	at org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:223)
	at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
	at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:628)
	at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
	at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:565)
	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:474)
	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:377)
	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:330)
	at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
	at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:135)
	... 43 more
Caused by: java.net.SocketException: Unexpected end of file from server
	at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:772)
	at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633)
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1324)
	at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468)
	at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.getResponseCode(URLConnectionHTTPConduit.java:266)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1531)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1504)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1310)
	... 55 more
2015-07-29 21:52:25 INFO  org.apache.cxf.service.factory.ReflectionServiceFactoryBean  - Creating Service {http://sumws.reliable.wiesbaden.fh.de/}SumWebServiceService from class de.fh.wiesbaden.reliable.client.SumWebService
2015-07-29 21:52:25 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Outbound Message
---------------------------
ID: 5
Address: http://rs2-05.vs.cs.hs-rm.de:8082
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], Connection=[Keep-Alive], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operation xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><a>1.0</a><b>2.0</b></ns1:operation></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:52:25 WARN  org.apache.cxf.phase.PhaseInterceptorChain  - Interceptor for {http://sumws.reliable.wiesbaden.fh.de/}SumWebServiceService#{http://sumws.reliable.wiesbaden.fh.de/}operation has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Could not send Message.
	at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64)
	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
	at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:565)
	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:474)
	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:377)
	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:330)
	at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
	at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:135)
	at com.sun.proxy.$Proxy49.operation(Unknown Source)
	at de.fh.wiesbaden.reliable.client.ClientExecutor.operation(ClientExecutor.java:78)
	at de.fh.wiesbaden.reliable.client.ClientExecutor.operation(ClientExecutor.java:88)
	at de.fh.wiesbaden.reliable.client.ClientExecutor.operation(ClientExecutor.java:48)
	at de.fh.wiesbaden.reliable.math.MathParser.parseExpression(MathParser.java:66)
	at de.fh.wiesbaden.reliable.math.MathParser.parse(MathParser.java:29)
	at de.fh.wiesbaden.reliable.view.Homepage.calculate(Homepage.java:28)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:247)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:267)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	at javax.faces.component.UICommand.broadcast(UICommand.java:315)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:654)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1521)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1478)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.ConnectException: ConnectException invoking http://rs2-05.vs.cs.hs-rm.de:8082: Connection refused
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1339)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1323)
	at org.apache.cxf.io.CacheAndWriteOutputStream.postClose(CacheAndWriteOutputStream.java:50)
	at org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:223)
	at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
	at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:628)
	at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
	... 51 more
Caused by: java.net.ConnectException: Connection refused
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
	at java.net.Socket.connect(Socket.java:579)
	at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
	at sun.net.www.http.HttpClient.openServer(HttpClient.java:432)
	at sun.net.www.http.HttpClient.openServer(HttpClient.java:527)
	at sun.net.www.http.HttpClient.<init>(HttpClient.java:211)
	at sun.net.www.http.HttpClient.New(HttpClient.java:308)
	at sun.net.www.http.HttpClient.New(HttpClient.java:326)
	at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:997)
	at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:933)
	at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:851)
	at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1092)
	at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.setupWrappedStream(URLConnectionHTTPConduit.java:174)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:1283)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.onFirstWrite(HTTPConduit.java:1239)
	at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.onFirstWrite(URLConnectionHTTPConduit.java:201)
	at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:47)
	at org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:69)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1296)
	... 56 more
2015-07-29 21:52:25 ERROR de.fh.wiesbaden.reliable.client.ClientExecutor  - 
javax.xml.ws.WebServiceException: Could not send Message.
	at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:146)
	at com.sun.proxy.$Proxy49.operation(Unknown Source)
	at de.fh.wiesbaden.reliable.client.ClientExecutor.operation(ClientExecutor.java:78)
	at de.fh.wiesbaden.reliable.client.ClientExecutor.operation(ClientExecutor.java:88)
	at de.fh.wiesbaden.reliable.client.ClientExecutor.operation(ClientExecutor.java:48)
	at de.fh.wiesbaden.reliable.math.MathParser.parseExpression(MathParser.java:66)
	at de.fh.wiesbaden.reliable.math.MathParser.parse(MathParser.java:29)
	at de.fh.wiesbaden.reliable.view.Homepage.calculate(Homepage.java:28)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:247)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:267)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	at javax.faces.component.UICommand.broadcast(UICommand.java:315)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:654)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1521)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1478)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.ConnectException: ConnectException invoking http://rs2-05.vs.cs.hs-rm.de:8082: Connection refused
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1339)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1323)
	at org.apache.cxf.io.CacheAndWriteOutputStream.postClose(CacheAndWriteOutputStream.java:50)
	at org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:223)
	at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
	at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:628)
	at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
	at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:565)
	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:474)
	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:377)
	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:330)
	at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
	at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:135)
	... 44 more
Caused by: java.net.ConnectException: Connection refused
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
	at java.net.Socket.connect(Socket.java:579)
	at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
	at sun.net.www.http.HttpClient.openServer(HttpClient.java:432)
	at sun.net.www.http.HttpClient.openServer(HttpClient.java:527)
	at sun.net.www.http.HttpClient.<init>(HttpClient.java:211)
	at sun.net.www.http.HttpClient.New(HttpClient.java:308)
	at sun.net.www.http.HttpClient.New(HttpClient.java:326)
	at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:997)
	at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:933)
	at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:851)
	at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1092)
	at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.setupWrappedStream(URLConnectionHTTPConduit.java:174)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:1283)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.onFirstWrite(HTTPConduit.java:1239)
	at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.onFirstWrite(URLConnectionHTTPConduit.java:201)
	at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:47)
	at org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:69)
	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1296)
	... 56 more
2015-07-29 21:52:28 INFO  org.apache.cxf.service.factory.ReflectionServiceFactoryBean  - Creating Service {http://sumws.reliable.wiesbaden.fh.de/}SumWebServiceService from class de.fh.wiesbaden.reliable.client.SumWebService
2015-07-29 21:52:28 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Outbound Message
---------------------------
ID: 6
Address: http://rs2-02.vs.cs.hs-rm.de:8082
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], Connection=[Keep-Alive], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operation xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><a>1.0</a><b>2.0</b></ns1:operation></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:52:29 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Inbound Message
----------------------------
ID: 6
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {content-type=[text/xml;charset=UTF-8], Server=[Jetty(8.1.14.v20131031)], transfer-encoding=[chunked]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operationResponse xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><result>3.0</result></ns1:operationResponse></soap:Body></soap:Envelope>
--------------------------------------

Neuer Primary Log

2015-07-29 21:51:30 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - Groupmembers: [
2015-07-29 21:51:30 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-04.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 21:51:30 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-03.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 21:51:30 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-01.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 21:51:30 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-05.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 21:51:30 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-02.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 21:51:30 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - ]
2015-07-29 21:52:28 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - rs2-02.vs.cs.hs-rm.de:8082 is Primary
2015-07-29 21:52:28 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - Groupmembers: [
2015-07-29 21:52:28 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-04.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 21:52:28 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-03.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 21:52:28 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-01.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 21:52:28 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - {"address":"http://rs2-02.vs.cs.hs-rm.de:8082","waitTime":0,"fault":0.0}
2015-07-29 21:52:28 INFO  de.fh.wiesbaden.reliable.sumws.ExecutorSum  - ]
2015-07-29 21:52:28 INFO  org.apache.cxf.services.ServiceSumService.SumWebServicePort.SumWebService  - Inbound Message
----------------------------
ID: 2
Address: http://rs2-02.vs.cs.hs-rm.de:8082/
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml; charset=UTF-8
Headers: {Accept=[*/*], Cache-Control=[no-cache], connection=[keep-alive], Content-Length=[211], content-type=[text/xml; charset=UTF-8], Host=[rs2-02.vs.cs.hs-rm.de:8082], Pragma=[no-cache], SOAPAction=[""], User-Agent=[Apache CXF 2.7.9]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operation xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><a>1.0</a><b>2.0</b></ns1:operation></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:52:28 INFO  de.fh.wiesbaden.reliable.calcStrategy.AverageCalculationStrategy  - delegate calculation to http://rs2-04.vs.cs.hs-rm.de:8082/Sum
2015-07-29 21:52:28 INFO  de.fh.wiesbaden.reliable.calcStrategy.AverageCalculationStrategy  - delegate calculation to http://rs2-03.vs.cs.hs-rm.de:8082/Sum
2015-07-29 21:52:28 INFO  de.fh.wiesbaden.reliable.calcStrategy.AverageCalculationStrategy  - delegate calculation to http://rs2-01.vs.cs.hs-rm.de:8082/Sum
2015-07-29 21:52:28 INFO  org.apache.cxf.service.factory.ReflectionServiceFactoryBean  - Creating Service {http://sumws.reliable.wiesbaden.fh.de/}SumWebServiceService from class de.fh.wiesbaden.reliable.client.SumWebService
2015-07-29 21:52:28 INFO  org.apache.cxf.service.factory.ReflectionServiceFactoryBean  - Creating Service {http://sumws.reliable.wiesbaden.fh.de/}SumWebServiceService from class de.fh.wiesbaden.reliable.client.SumWebService
2015-07-29 21:52:28 INFO  org.apache.cxf.service.factory.ReflectionServiceFactoryBean  - Creating Service {http://sumws.reliable.wiesbaden.fh.de/}SumWebServiceService from class de.fh.wiesbaden.reliable.client.SumWebService
2015-07-29 21:52:29 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Outbound Message
---------------------------
ID: 3
Address: http://rs2-03.vs.cs.hs-rm.de:8082/Sum
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], Connection=[Keep-Alive], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operation xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><a>1.0</a><b>2.0</b></ns1:operation></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:52:29 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Outbound Message
---------------------------
ID: 4
Address: http://rs2-01.vs.cs.hs-rm.de:8082/Sum
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], Connection=[Keep-Alive], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operation xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><a>1.0</a><b>2.0</b></ns1:operation></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:52:29 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Outbound Message
---------------------------
ID: 5
Address: http://rs2-04.vs.cs.hs-rm.de:8082/Sum
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], Connection=[Keep-Alive], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operation xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><a>1.0</a><b>2.0</b></ns1:operation></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:52:29 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Inbound Message
----------------------------
ID: 5
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {content-type=[text/xml;charset=UTF-8], Server=[Jetty(8.1.14.v20131031)], transfer-encoding=[chunked]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operationResponse xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><result>3.0</result></ns1:operationResponse></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:52:29 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Inbound Message
----------------------------
ID: 3
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {content-type=[text/xml;charset=UTF-8], Server=[Jetty(8.1.14.v20131031)], transfer-encoding=[chunked]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operationResponse xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><result>3.0</result></ns1:operationResponse></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:52:29 INFO  de.fh.wiesbaden.reliable.calcStrategy.AverageCalculationStrategy  - Answer from http://rs2-03.vs.cs.hs-rm.de:8082/Sum is 3.0
2015-07-29 21:52:29 INFO  de.fh.wiesbaden.reliable.calcStrategy.AverageCalculationStrategy  - Answer from http://rs2-04.vs.cs.hs-rm.de:8082/Sum is 3.0
2015-07-29 21:52:29 INFO  org.apache.cxf.services.SumWebServiceService.ServiceSumServicePort.ServiceSumService  - Inbound Message
----------------------------
ID: 4
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {content-type=[text/xml;charset=UTF-8], Server=[Jetty(8.1.14.v20131031)], transfer-encoding=[chunked]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operationResponse xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><result>3.0</result></ns1:operationResponse></soap:Body></soap:Envelope>
--------------------------------------
2015-07-29 21:52:29 INFO  de.fh.wiesbaden.reliable.calcStrategy.AverageCalculationStrategy  - Answer from http://rs2-01.vs.cs.hs-rm.de:8082/Sum is 3.0
2015-07-29 21:52:29 INFO  org.apache.cxf.services.ServiceSumService.SumWebServicePort.SumWebService  - Outbound Message
---------------------------
ID: 2
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml
Headers: {}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:operationResponse xmlns:ns1="http://sumws.reliable.wiesbaden.fh.de/"><result>3.0</result></ns1:operationResponse></soap:Body></soap:Envelope>
--------------------------------------

Evaluation

Die Replikation der Services erhöht die Verfügbarkeit des gesamten Systems. Dieses Verhalten wird als Fehlerbaum dargestellt.

RelSysSS15 P2 KeinErgebnis.svg

Die Ausfallwahrscheinlichkeit beträgt somit Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle X_{Ausfall} = X_{S1} ∧ X_{S2} ∧ X_{S3} ∧ X_{S4} ∧ X_{S5} = X_{S1} * X_{S2} * X_{S3} * X_{S4} * X_{S5}} mit Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle X_{Sa}=Ausfallwahrscheinlichkeit(Service_a)} . Die Multiplikation der Ausfallwahrscheinlichkeiten die kleiner 1 sind, reduziert sie, das bedeutet das die Ausfallwahrscheinlichkeit des ganzen Systems niedriger ist als die von einem einzelnen Service.

Jede einzelne Strategie hat ihre Vor- und Nachteile. Im diesen Bereich werden diese gegenübergestellt.

Strategie Vorteile Nachteile
Mittelwertbildung (Average Calculation Strategy)
  • Schnelle und einfache Umsetzung.
  • Große Anzahl an Replikationsinstanzen ist nötig um grobe Fehler auszugleichen.
Mehrheit (Majority Calculation Strategy)
  • Unter der Annahme, dass es weniger defekte Secondaries als normal funktionierende in der Gruppe sind (Oder die defekte Secondaries liefern verschieden Ergebnisse), liefert diese Strategie ein korrektes Ergebnis.
  • Braucht am meistens Rechenzeit (3 Schritte sind nötig: Sammeln, Zählen, Wählen) und somit ist die Antwortlatenz höher als bei den anderen Strategien
  • Kann ein falsches Ergebnis liefern, wenn defekte Secondaries ein gemeinsames falsches Ergebnis liefern und das Vorkommen größer oder gleich dem Vorkommen des korrekten Ergebnis ist.
Erstes Ergebnis (First Calculation Strategy)
  • Liefert ein schnelles Ergebnis
  • Braucht Threadsicherheit um das erste Ergebnis nicht zu überschreiben, wenn weitere Ergebnisse zurückgeliefert werden
  • Ein defekter Secondary könnte als erstes eine Antwort liefern. (Keine Korrektur)

Der Fehlerbaum für das gesamte System sieht dann wie folgt aus

RelSysSS15 P2 FehlerBaumALL.svg

Die Fehlerwahrscheinlichkeit beträgt somit Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle X_{Fehler}=X_{Ausfall} ∨ X_{Falsches Ergebnis} = X_{Ausfall} + X_{Falsches Ergebnis} - X_{Ausfall} * X_{Falsches Ergebnis}} mit Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle X_{Falsches Ergebnis} = X_{Average} ∨ X_{Majority} ∨ X_{First} } Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://en.wikipedia.org/api/rest_v1/“:): {\displaystyle = X_{Average} + X_{Majority} + X_{First} - X_{Average} * X_{Majority} - X_{Average} * X_{First} - X_{Majority} * X_{First} + X_{Average} * X_{Majority} *X_{First}}

Fazit

Verteilte System sind überall präsent. Große Berechnungen werden nicht mehr lokal in einer Maschine ausgeführt, sie werden in der "Cloud" ausgelagert. Je nach Anforderung kann die Hardware horizontal skaliert werden. Ein solches System verlässlich zu entwickeln ist sehr komplex. Es existieren sehr viele externe Faktoren, die die Ergebnisse fälschen oder die Komponenten aus der Kommunikation trennen könnten. Im Projekt wurden mehrere Ansätze verfolgt um diese Fehler zu erkennen und zu korrigieren. Apache Zookeeper bietet eine Reihe von Features, die das Entwickeln solcher Applikationen vereinfachen. Die Überwachung des einzelnen Services, die Konfigurationsverteilung, die Primary-Election sind komplexe Aufgaben, die ohne Zookeeper mehrere Wochen in Anspruch genommen hätten. Ein weiterer Vorteil von Zookeeper ist es, dass das Projekt sehr gut dokumentiert ist. Beispiele sind recht schnell gefunden. Die Einbindung von Apache CFX ins Projekt war anfangs recht einfach. Wenn aber komplexere Aufgaben gelöst werden sollten, waren kaum oder veraltete Beispiele auf der Seite des CFX Projekts zu finden.

Im Projekt wurden drei Standard-Methodiken um Fehler zu korrigieren vorgestellt. Jede einzelne Strategie hat Vor- und Nachteile. Je nach Nutzungszweck und/oder Erfahrungswerte sollte die Strategie ausgewählt werden. Bei der First Strategy z. B. könnte das fehlerhafte WebService nah am Primary plaziert sein und somit immer ein falsches Ergebnis zurückliefern.

Persönlich empfinde ich das Projekt als äußerst gelungen und denke, dass es nicht das letzte Mal ist, dass ich mich mit dem Thema "Verlässlichkeit" befassen werde.

Quellen