# Warum möchte man asynchrone Methode implementieren?



## oraclin25 (17. Dezember 2013)

Hallo zusammen,

durch Zufall bin ich auf das Thema asynchroner Methodenaufruf gestoßen.  Gegoogelt und gegoogelt, ich habe viele Details zur Implementierung bekommen:
1.  Es wird ein eigener Thread zur Ausführung der Methode erstellt
2. Man kann "fortfahren" bevor die Methode fertig wird.

Zu dem Grund, warum man überhaupt asychrone Kommunikation haben möchte, habe ich wenig gefunden, meistens wird gesagt, dass durch asynchrone Methode der Client sich nicht langweilt, bzw. man nicht drauf warten muss, bevor weitere Operation/Funktionen angestoßen werden können.

Soweit so gut.  Ich habe allerdings eine Frage, die ich sehr grundlegend finde:
Angenommen, die Funktion soll einen bestimmten Betrag eines Kontos abziehen(Client möchte Geld abheben).  Man baut dazu eine asychrone Methode, sagen wir mal die Methode KontostandReduzieren(int betrag).  Bei so einem Vorgang folgt logischerweise die Methode geldAusgeben(), die am Automaten den Betrag ausspuckt.

Wenn also in dem Konto nicht genügend Geld vorhanden ist, und die Methode KontostandReduzieren als asynchron deklariert wird, dann geht das Ganze doch schief, wenn vor Ende der Methode bereits eine weitere Methode ausgeführt wird?

Vielen Dank für Eure Hilfe.

Schöne Grüße aus Rheinland,

Eure Ratna


----------



## sheel (17. Dezember 2013)

Hi

warum neue Begriffe einführen?
Deine asynchrone Methode ist einfach Thread.

Und sinnmäßig passt da einiges nicht.
Du hast damit recht, dass es sehr blöd wäre, wenn der Automat das Geld ausspuckt,
bevor die Möglichkeitsgarantie vom Konto da ist.
Genau deswegen macht das kein echter Automat so, die warten darauf
Ganz ohne Thread.


----------



## Funresort (17. Dezember 2013)

Uhrzeit Anzeige zum Beispiel läuft asynchron zum Programm^^


----------



## oraclin25 (17. Dezember 2013)

Hallo sheel,

danke für die rasche Antwort erstmal.  

Das bedeutet: nur asynchrone Methode verwenden, wenn es Sinn macht.

Was wäre ein Beispiel, wo asynchrone Methode sinnvoll ist?

Vielen lieben Dank.

Viele Grüße aus Rheinland,

Eure Ratna


----------



## Funresort (17. Dezember 2013)

Uhrzeitabfrage vom Server, Datenübertragung ( Beispiel Cloud ), Games etc.


----------



## oraclin25 (17. Dezember 2013)

Hallo zusammen,

Uhrzeit anzeigen läuft asynchron.  Das heißt, asynchrone Methoden implementieren meistens "Kleinigkeiten"?

Angenommen, ich betreibe EINE Bank-Datenbank.  Meine Kunden sind Kontoinhaber.  Wenn alle parallel nach dem Kontostand abfragen, hat das mit asynchroner Methode zu tun?  Wie gewährleiste ich denn, dass alle Abfragen sehr schnell beantwortet werden können?

Viele Grüße aus Rheinland,

Eure Ratna


----------



## Thomas Darimont (17. Dezember 2013)

Hallo,

ein paar Usecases die von asynchroner Ausführung profitieren sind:
1) Versenden von E-Mails - Oft ist es nicht relevant zu wissen, ob eine Email tatsächlich versendet "wurde", oft reicht es zu wissen das sie gesendet "wird".
2) Wenn man unabhängige Verarbeitungen parallel ausführt, kann die reale Ausführungsdauer deutlich unter der Dauer liegen, die bei rein sequenzieller Verarbeitung anfallen würde. On solchen Szenarien kann man dann die parallel auszuführenden Tasks über einen ExecutorService starten und über ein Future (= Handle für den asynchronen Ablauf bzw. auf das Ergebnis der Ausführung) an späterer Stelle wieder synchronisieren.
3) Lang laufende Batch Operationen die man zwar starten aber nicht synchron auf deren Beendigung warten möchte.
4) Durchführung von Hintergrundverarbeitung (Sicherung, bzw. Aufräumarbeiten)

Gruß Tom


----------



## Funresort (17. Dezember 2013)

Prioritäten etc. Du kannst einfach ne Warteschlange (aufteilung auf mehrere Server und Ports zur verarbeitun) benutzen  so wirds normalerweise auch gemacht  Thomas hat nette Beispiele aufgeführt


----------



## oraclin25 (18. Dezember 2013)

Hallo zusammen,

vielen lieben Dank für Eure Hilfestellungen.  Ich bin mal gespannt, ob nachher in dem Projekt eine asynchrone Methode überhaupt vorkommt, für welche Aufgabe auch immer.  

Mal eine andere Frage:
anhand eines Tutorials musste ich beim Programmieren einer einfachen Java-EE-Applikation den Zugriff auf den Naming-Service des Applikationsservers(WebLogic) haben, dazu einfach:


```
Properties p = new Properties();
p.put(Context.PROVIDER_URL, "t3://localhost:7001");
p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
```

Zu Anfang habe ich nicht verstanden, wofür das Ganze gut ist.  Gegoogelt und gegoogelt, habe ich dann gelernt, dass die Zeilen dazu da sind, um den Wurzel-Directory des Naming-Services von dem WebLogic bekannt zu geben bzw. zu verwenden.  Hintergrund = alle Objekte(somit auch die EJBeans?) werden mit Hilfe des JNDI in diesem JNDI-Baum gespeichert?

Ich frage mich:
1. In welchen Fällen kann es vorkommen, dass der Eintrag für Context.INITIAL_CONTEXT_FACTORY etwas anderes ist als "weblogic.jndi.WLInitialContextFactory" ?

2. Kommt diese Thematik lediglich beim Programmieren, wo ein Applikationsserver mit im Spiel ist?  Ich meine, beim Programmieren im Bereich Desktop-Java brauche ich ja diese Thematik gar nicht?  Wobei ich glaube, ich könnte im Bereich Desktop-Java sicherlich auch mit Hilfe der JNDI-Schnittstelle auf den Naming-Service irgendeines Servers zugreifen?

Och je, ich hoffe, meine Fragen sind nicht allzu schwammig.

Viele Grüße aus Rheinland,

Eure Ratna


----------



## Thomas Darimont (18. Dezember 2013)

Hallo,

1) Wenn du deine (standard) JEE Anwendung auf einem anderen Application Server laufen lässt müsstest du eine andere INITIAL_CONTEXT_FACTORY verwenden. Wenn du deinen Code Portabel halten möchtest bietet es sich deshalb an, die JNDI Verbindungsinformationen in einer externen Konfiguration abzulegen.

Standardmäßig unterstützt Java die Konfiguration der JNDI Context-Verbindungsparameter über eine Datei jndi.properties die im Classpath liegen muss. Hast du eine solche Datei im Classpath hinterlegt brauchst du in deiner Client Anwendung einfach nur via InitialContext ctx = new InitialContext(); einen entsprechenden Namingcontext erzeugen - dieser verwendet dann die Konfiguration aus JNDI Properties. 

Innerhalb einer Enterprise / Web Application reicht es in der Regel auch aus einfach nur InitialContext ctx = new InitialContext(); zu machen, denn die notwendigen JNDI Konfiguration sind da oft schon entsprechend hinterlegt (entweder via jndi.properties File im Classpath oder entsprechende System-Properties).

2) Jein. Ja JNDI brauchst du eigentlich überwiegend dann, wenn du Komponenten eines Application Server aufsuchen möchtest (JNDI-Lookup). Du kannst JNDI aber auch verwenden um einen Verzeichnisdienst wie LDAP abzufragen.

Gruß Tom


----------



## oraclin25 (18. Dezember 2013)

vielen lieben Dank zusammen, nehme ich so ins Projekt mit.

Viele Grüße aus Rheinland,

Eure Ratna


----------

