TU Wien:Distributed Systems Technologies VL (Froihofer)/Mögliche Prüfungsfragen SS08
Das hier soll eine ausgearbeitete Liste von Prüfungsfragen werden. Ich stelle zuerst mal ein paar Fragen von vergangenen Prüfungen hier herein - vielleicht können wir sie gemeinsam beantworten.
Was sind Plugins? Warum haben Plugins eine wesentliche Bedeutung in Enterprise Applikationen? (1 Punkt)[Bearbeiten | Quelltext bearbeiten]
Plugins sind Programm-Erweiterungen, die dynamisch von der Applikation geladen werden können.
Wichtige Eigenschaften:
- Muss nicht zur Programmier-Zeit der Applikation bekannt sein
- Dynamisch zur Laufzeit der Applikation ladbar/austauschbar
Wie funktioniert dynamisches Laden von Klassen bei Java oder .NET (eine Technologie wählen)? Wo liegt der Zusammenhang mit Plugins? (2 Punkte)[Bearbeiten | Quelltext bearbeiten]
Java: Üblicherweise lädt der System-Classloader die Klassen aus dem Classpath. Wenn man Klassen von einem anderen Ort (Filesystem, Web, etc) laden möchte, braucht man einen eigenen Classloader. Plugins sind nichts anderes als Java-Klassen die durch einen Classloader zur Laufzeit in die jeweilige Applikation geladen werden. Die erzeugten Instanzen sind mit dem ladenden Classloader verbunden. Wenn eine neue Version der Klasse geladen werden soll und die alte Instanz erhalten bleiben soll, so muss eine neue Instanz des Classloaders instanziert werden.
Schreiben sie eine Java Annotation oder ein .NET Attribute um den Namen einer Konfigurationsdatei an eine Klasse zu binden. Wie sieht die Deklaration des Attributes aus? Wie sieht das Auslesen eines Attributes zur Laufzeit aus? (Wenn sie die genauen Calls nicht kennen, geben sie Pseudocode an). (3 Punkte)[Bearbeiten | Quelltext bearbeiten]
Java-Annotation:
@Target(ElementType.TYPE) // (optional) default: keine Einschränkung
@Retention(RetentionPolicy.RUNTIME) // (optional) default: SOURCE
public @interface KonfigFileAnnotation { // Um die Annotation zur Laufzeit auslesen
String konfigurationsdatei(); // zu können benötigt man RUNTIME.
}
Anwendung:
@KonfigFileAnnotation(konfigurationsdatei="../config.cfg")
public class MyClass {}
Auslesen eines Attributes:
MyClass o = new MyClass();
Class<? extends MyClass> c = o.getClass();
KonfigFileAnnotation a = c.getAnnotation(KonfigFileAnnotation.class);
String attribute = a.konfigurationsdatei();
Wie sieht die prinzipielle Architektur eines 3-Tier Systems aus? Welche Gründe sprechen dafür, die Business Logic (vertikal) aufzuteilen? Welche Aufgaben haben die einzelnen Teile? (4 Punkte)[Bearbeiten | Quelltext bearbeiten]
Die drei Layer sind üblicherweise:
- GUI: Darstellung und Userinteraktion
- Applikations-Logik: Businesslogik, Security, Loadbalancing
- Datenbank: Persisiterungsmechanismen, Datenbankabstraktion
Die Gründe können sein, dass man das Loadbalancing einfacher gestalten kann, oder eine klare Trennung zwischen Applikationslogik und GUI benötigt um verschiedene Frontend-Lösungen zu unterstützen (Rich-Client/Web-Client).
Wofür wird das Identity Map Pattern verwendet? (Zusammenhang: Objekt-Relationales Mapping). Welche Probleme treten ohne Identity Map auf? (4 Punkte)[Bearbeiten | Quelltext bearbeiten]
Das Identity Map Pattern wird verwendet um zu verhindern, dass 2 unabhängige Teile einer Applikation, die eine Referenz auf das selbe Datenobjekt in der Datenbank haben, unabhängig voneinander Daten ändern, die beim Zurückschreiben verloren gehen könnten. Eine Identity Map fungiert als eine Art Proxy zwischen der Applikation und der Datenbank. Wenn das Datenobjekt bereits von der Datenbank gelesen wurde, ist es in der Identity Map enthalten und kann von dort aus an die Applikationsteile übergeben werden, die dann alle über dieselbe Referenz auf das selbe Objekt zugreifen (keine Kopien).
Probleme ohne Identity Map:
- Datenverlust durch überschreiben
- möglicher Performanceverlust
Wie müssen Sie die folgende Klasse Person minimal annotieren, um sie Mittles ORM JPA/Hibernate zu persistieren? (3 Punkte)[Bearbeiten | Quelltext bearbeiten]
public class Person {
int id;
String nachname;
String vorname;
String adresse;
}
Antwort (field access):
@Entity
public class Person {
@Id
int id;
String nachname;
String vorname;
String adresse;
}
Antwort (property access):
@Entity
public class Person {
int id;
String nachname;
String vorname;
String adresse;
@Id
public int getId() {...}
public void setId(...) {...}
public String getNachname() {...}
public void setNachname(...) {...}
public String getVorname() {...}
public void setVorname(...) {...}
public String getAdresse() {...}
public void setAdresse(...) {...}
}
Welche Vorteile liegen darin parametrisierte Queries zu verwenden? Welche schlechte Alternative sollte nicht verwendet werden, und warum? Welche Vorteile liegen darin, Queries zu benennen und nicht im Code zu inkludieren? (4 Punkte)[Bearbeiten | Quelltext bearbeiten]
Parametrisierte Queries sind leichter zu analysieren als Queries mit String-Concatenation. Beide Varianten werden verwendet, um dynamische Queries zur Laufzeit zu generieren (Beispielsweise Datenbankabfragen mit durch den User bestimmbare Filterkriterien). Die Variante der String-Concatenation hat weiters den großen Nachteil der SQL-Injection und stellt dadurch ein Sicherheitsrisiko dar.
Die Verwendung von benannten Queries hat den Vorteil die Query-Logik von der Programm-Logik zu trennen. Die Queries können in ein XML- oder Konfigurations-File ausgelagert werden, und bei Bedarf ohne Neukompilierung/Deployment adaptiert werden.
Was versteht man unter dem Begriff "Setter Injection", wie wird "Setter Injection" realisiert? Nennen sie einen Anwendungsfall von Setter Injection. (3 Punkte)[Bearbeiten | Quelltext bearbeiten]
Setter Injection beschreibt die Dependency Injection mit Hilfe einer vordefinierten Setter-Methode.
class MyClass {
String configFile;
public setConfigFile(String file) {
configFile=file;
}
}
Setter Injection wird überall dort eingesetzt, wo man einer Klasse nach ihrer Instanzierung weitere Daten übergibt: student.setName("Himmelbauer")
Erklären sie das Claim Check Pattern im Zusammenhang mit Message Queuing. (4 Punkte)[Bearbeiten | Quelltext bearbeiten]
Das Claim Check Pattern beschreibt eine Kombination eines Content-Filters mit einem Content-Enrichers.
Ablauf:
- der Content-Filter entfernt Daten aus der Nachricht, die für die Verarbeitung nicht gebraucht werden, und legt diese in einen Zwischenspeicher
- die (reduzierte) Nachricht mit den relevanten Daten wird verarbeitet
- der Content-Enricher fügt die zwischengespeicherten Daten wieder hinzu und sendet die Nachricht weiter
Was ist Transaction Propagation? (2 Punkte)[Bearbeiten | Quelltext bearbeiten]
Beschreibt die Übertragung der Transaktion auf das aufzurufende Zielobjekt (EJB) (-> bezieht sich auf Methodenaufrufe). Für jedes EJB kann bestimmt werden welche Bedingungen für eine Transaktionsübergabe gelten müssen. Es gibt folgende Attribute:
- Supports: Eine (beim Caller) bestehende Transaktion wird übernommen. Wenn keine Transaktion offen ist, wird keine neue angelegt.
- Required: Eine (beim Caller) bestehende Transaktion wird übernommen. Es wird eine neue Transaktion angelegt, wenn beim Caller keine besteht.
- RequiresNew: Es wird beim Zielobjekt immer eine neue Transaktion angelegt.
- Mandatory: Eine (beim Caller) bestehende Transaktion wird vorausgesetzt.
- NotSupportet: Es wird keine Transaktion vorausgesetzt und keine neue angelegt.
- Never: Es darf keine Transaktion übergeben werden.
Wie funktionieren bei .NET Enterprise Services die Status Bits bei Transaktionsfähigen Komponenten? (3 Punkte)[Bearbeiten | Quelltext bearbeiten]
Wurde glaube ich dieses Semester nicht behandelt...
Erklären Sie die Lebenszyklen von Enterprise JavaBeans Stateless Session Beans, und Stateful Session Beans ( mit Zustandsübergangsdiagramm) (5 Punkte)[Bearbeiten | Quelltext bearbeiten]
Stateful Session Beans:
States:
- Does not exist: Objekt noch nicht instanziert
- Ready: Objekt ist instanziert und bereit zur Verwendung
- Passive: Objekt-Status wurde persistiert
Stateless Session Beans:
States:
- Does not exist: Objekt noch nicht instanziert
- Pooled: Objekt ist instanziert und im Pool verfügbar
- Ready: Objekt wurde aus Pool geholt und steht zur Verwendung bereit
Welche 3 Contract-Typen kommen bei Windows Communication Fondation zum Einsatz, und welche Bedeutung haben Sie? (2 Punkte)[Bearbeiten | Quelltext bearbeiten]
Service Contract: Beschreibt die Operationen eines Service.
Data Contract: Beschreibt die erlaubten Datentypen und Datenelemente einer Operation.
Message Contract: Beschreibt die Struktur einer Message; Präzise Definition von Header und Body.
Aus welchen Teilen Besteht ein Endpunkt bei WCF? (2 Punkte)[Bearbeiten | Quelltext bearbeiten]
Contract: Definition der Services => Methoden und Datentypen
Address: URL des Service; http://myserver.com:8080/MyService
Binding: Definiert das verwendete Protokoll des Endpoints; es gibt 9 vordefinierte Typen
Schreiben Sie ein minimales Web-Service in Java 6 oder WCF inclusive Hosting/Initialisierungsteil, dass die Addition zweier Zahlen realisiert. (Sie können statt den genauen API-Calls auch Pseudocode verwenden, allerdings muss dann entsprechend Aufschluss darüber gegeben sein, dass Sie die korrekten Konzepte verwenden). Überlegen Sie selbst, welche Programmteile notwendig sind. (3 Punkte)[Bearbeiten | Quelltext bearbeiten]
Notwendig sind eine Implementierung des Calculators und eine Hosting-Applikation.
Beispiel für die Calculator-Implementierung:
@WebService(targetNamespace="http://dsg.net/tvs", name="Calculator")
public class CalculatorImpl {
@WebMethod
public int add(int a, int b) {
return a+b;
}
}
Beispiel eines (Self-)Hostings:
public static void main(String[] args) {
Endpoint ep = Endpoint.publish("http://www.dsg.net/tvs", new CalculatorImpl());
//warten bis Tastendruck
ep.stop();
}
Es soll eine Enterprise Applikation mit unten folgender Spezifikation entworfen werden. Entwerfen sie eine geeignete 3-Tier Architektur. Welche Technologien können sie für die entsprechenden Tiers verwenden? Geben sie bitte auch Alternative Technologien an. (12 Punkte)[Bearbeiten | Quelltext bearbeiten]
Eine Tanzschule verwendet ein Computersystem um Kunden und Kurse zu verwalten. Ebenfalls im Computersystem sind Musikstücke gespeichert, die in Kursen zum Einsatz kommen. Über ein Web-Interface können sich Kunden zu Kursen anmelden. Die Kursanmeldung kann aber auch innerhalb der Tanzschule über PCs erledigt werden, die nur von Mitarbeitern der Tanzschule benutzt werden können. Mitarbeiter der Tanzschule können neue Kurse anlegen sowie Musikstücke einspielen.
Die Tanzschule hat mehrere Standorte in unterschiedlichen Städten. Die PCs an den unterschiedlichen Standorten müssen nicht permanent eingeschaltet bzw. online sein.
Überlegen sie welche Daten zentral verwaltet werden können, welche Daten an jedem Standort repliziert werden müssen. Wie kann ein Datenabgleich realisiert werden.
Welche Transaktions-Attribute können Sie verwenden (alle möglichen) um bei den Szenarios (1), (2) das erwünschte Resultat zu erhalten: Welche Transaktionen sind involviert, wer initiiert diese Transaktionen? Hinweis: eine Skizze kann helfen das Beispiel zu lösen (6 Punkte)[Bearbeiten | Quelltext bearbeiten]
Bussiness Components A1, B1, A2, B2 seien gegeben; wobei A2 stets von A1 Aufgerufen wird. B2 stets von B1 aufgerufen wird. Der Client C erzeugt jeweils A1 und B1 und ruft diese auf.
(1) A1 und A2 sollen in derselben Transaktion ablaufen. Das Ergebnis von B2 soll (commit/rollback) unabhängig vom Commit-Status der Transaktion von A1, A2 sein. B1 soll den Ausgang der Transaktion von A2 beeinflussen können (auf rollback setzen).
(2) Das Ergebnis des (transaktionsfähigen) Aufrufs von A2 wird vom Ausgang von A1 beeinflusst. Das Ergebnis des (transaktionsfähigen) Aufrufs von B2 wird vom Ausgang von B1 beeinflusst. Ansonsten sind die Transaktionen unabhängig.
Szenario 1:
Vom Client C wird eine Transaktion initiiert und umfasst C, A1, A2 und B1. B2 initiiert eine eigene unabhängige Transaktion.
Verwendbare Transaktios-Attribute (wenn man nur die Business Components für sich betrachtet):
- A1: Requires, Mandatory
- A2: Requires, Mandatory
- B1: Mandatory
- B2: RequiresNew
Szenario 2:
Es gibt 2 Transaktionen: Die erste wird von A1 initiiert und umfasst A1 und A2, die zweite wird von B1 initiiert und umfasst B1 und B2.
Verwendbare Transaktios-Attribute (wenn man nur die Business Components für sich betrachtet):
- A1: Requires, RequiresNew
- A2: Requires, Mandatory
- B1: Requires, RequiresNew
- B2: Requires, Mandatory
Folgendes Datenbank-Modell sei gegeben. Rekonstruieren Sie ein passendes objekt-orientiertes Domain-Modell (entweder als Java/C# Source code oder als UML Modell). Geben Sie jeweils die entsprechenden Patterns (nur Patterns, keine Annotations!) an, um das Domain-Modell an das Datenbank-Modell mittels Objekt-Relationalen Mapping anzubinden. Dabei sollen Lehrling und Facharbeiter mittles Vererbung abgebildet werden. Eingebettete, aber zusammengehörige Datenelemente sollen als sogenannte Component realisiert werden. (6 Punkte)[Bearbeiten | Quelltext bearbeiten]
Anmerkung: Das ist mal so ungefähr gelöst. Vielleicht kann das noch mal wer durchsehen/überarbeiten...
@Embeddable
public class Adresse {
String strasse, plz, ort;
}
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class Angestellter {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
long id;
String nachname, vorname;
@Embeded
Adresse adresse;
@OneToOne(mappedBy="angestellter")
Beschaeftigungszeitraum beschaeftigung;
}
public class Beschaeftigungszeitraum {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
long id;
Date von, bis;
@JoinColumn(name="Angestellter_id")
Angestellter angestellter;
}
@Entity
public class Lehrling extends Angestellter {
}
@Entity
public class Facharbeiter extends Angestellter {
}
Verwendete Patterns:
- Adresse: embedded component
- Beschäftigungszeitraum: one to one Relation
- Angestellter/Facharbeiter/Lehrling: Class Table Inheritance
Folgender Code speichert ein Objekt mittels eines Objekt-Relationalen Mapping Tools. Welche (Hibernate) Objekt-Zustände nimmt die Variable p ein? Zeichnen sie die entsprechenden Zustände nach jeder relevanten Codezeile ein. (5 Punkte)[Bearbeiten | Quelltext bearbeiten]
class Person{
public int id;
public String nachname;
public String vorname;
public String adresse;
}
Person p = new Person(); // Transient
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.save(p); // Persistent
tx.commit();
session.close(); // Detached
int id = p.id;
session = sessionFactory.openSession();
p = (Person)session.get(Person.class, id); // Persistent
session.close(); // Detached
session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.update(p); // Persistent
tx.commit();
session.close(); // Detached
Folgendes Message Queuing System sei gegeben (Bild). Identifizieren Sie die verwendeten Message Queuing Patterns, jeweils mit einer kurzen Begründung (wenn Sie mehrere Patterns als zutreffend identifizieren können, geben Sie bitte alle Möglichkeiten an). (6 Punkte)[Bearbeiten | Quelltext bearbeiten]
Als Input sollen 2 verschiedene Applikationen (Web-GUI + Command-Line GUI dienen) die auf dieselbe Backend Applikation zugreifen
- Channel Adapter Pattern: Web und Command Line GUI sowie Backend Application greifen über Adaptoren auf die Message Queues zu
- Message Bus Pattern: Die Queues von Web und Command Line GUI münden in eine gemeinsame Bus Queue
Erklären sie kurz die Patterns "Row-Data Gateway" und "Transaction Script" (4 Punkte)[Bearbeiten | Quelltext bearbeiten]
Row-Data Gateway: Bindet die Domain Logic an eine Zeile aus der Datenbank. Ein Row-Data Gateway ist ein Objekt mit gleichen Feldern wie die Ziel-Tabelle. Zusätzlich gibt es Finder-Methoden, entweder als statische Methoden oder in einem eigenen Finder-Objekt.
Transaction Script: bedeutet die Verwendung von Prozeduren um Requests von den oberen Schichten auszuführen. Für jeden Request gibt es eine Prozedur. Von der Umsetzung her ähnlich dem "Command Pattern". Oft ist der Datenbank-Zugriff direkt in dem "Script" codiert.
Erklären sie das "Unit of Work" Pattern! (4 Punkte)[Bearbeiten | Quelltext bearbeiten]
Bei einer Unit of Work handelt es sich um ein Objekt, welches eine Liste von Datenbankobjekten, die von einer Transaktion betroffen sind, verwaltet und das Speichern von Änderungen sowie die Lösung von Nebenläufigkeitsproblemen koordiniert. Ziel ist die Reduktion der notwendigen Datenbank-Zugriffe.
Erklären Sie das "Routing Slip" Pattern im Zusammenhang mit Message Queuing. Nennen Sie Vor- und Nachteile! (4 Punkte)[Bearbeiten | Quelltext bearbeiten]
Routing-Slip beschreibt, dass der Nachricht ein vorgegebener Routing-Pfad mitgegeben wird.
Vorteil: Vereinfachte Verarbeitungslogik, nicht hard-wired, Performance
Nachteil: Pfad kann sich nicht dynamisch ändern.
Erklären sie bei JavaBeans die Beans-Art Session Beans. Welche Arten gibt es? Welche (Code-)Bestandteile hat ein Session Bean? (4 Punkte)[Bearbeiten | Quelltext bearbeiten]
Session Beans bieten eine Schnittstelle zur Interaktion mit dem Domänenmodell. Es gib zwei Arten:
- Stateless Session Beans (zustandslos, bieten Services durch unabhängige Methoden an)
- Stateful Session Beans (zustandsbehaftet, verwalten einen Konversationszustand über mehrere Methodenaufrufe)
Bestandteile einer Session Bean
- Default Constructor
- Service Methoden
- eventuell Umgebungsressourcen, die per Dependency Injection vom Container bereitgestellt werden können
- bei Stateful Session Beans eventuell eine Remove Methode, die bei einem Aufruf die Konversation beendet
Wie sieht bei .NET Remoting eine Implementierungsklasse aus? Es genügt ein minimales Beispiel mit einer aufrufbaren Operation. Anmerkung: Hier geht's um .NET Remoting, nicht WCF! (1 Punkt)[Bearbeiten | Quelltext bearbeiten]
public class MyService: MarshalByRefObject, IMyService { int DoService() {} }
Welche arichitekturellen Bestandteile von .NET Remoting durchläuft ein Funktions-Aufruf und was passiert jeweils? (6 Punkte)[Bearbeiten | Quelltext bearbeiten]
1) ClientObject mit Methodenaufruf x()
2) Transparent-Proxy generiert MessageObject für x()
3) Real-Proxy sendet das MessageObject an Channel
4) Channel bearbeitet MessageObject in diversen Sinks (Protokolle, Security, etc)
5) Physische Übertragung über das Medium
6) Channel bearbeitet empfangenes MessageObject in diversen Sinks
7) Real-Proxy empfängt MessageObject und ruft echtes (Remote-)Objekt auf x()