# synchron und asynchroner Methodenaufruf



## koplop (1. Sep 2006)

hallo,

ich habe folgendes Problem:

ich habe eine Methode, die synchron läuft.


```
public Antwort (Anfrage anfrage){

// hier soll dann der asynchrone Methodenaufruf erfolgen.. 
return antwort;
}
```

Nun will ich innerhalb dieser Methode eine asynchrone Kommunikation aufbauen, das heißt ich will eine Methode asführen, die eine Anfrage irgendwohin stellt. Dann soll derjeniege, der die Anfrage bekommt auch die Möglichkeit haben, mir eine Antwort zu senden.  Habe ich dann die Antwort, dann kann ich diese wieder in der synchronen Methode zurückgeben.

Synchron ist mir ja eigentlich klar, einfach eine Methode mit Rückgabewert. Wie realisere ich aber eine asynchrone Methode? 

Wenn ich eine Methode ohne Rückgabewert wegschicke, woher weiß dann der Empfänger das was angekommen ist?, und 
der Sender muss ja auch wiederum warten, oder horchen, um eine Antwort zu empfangen...

Ein Methodenbeispiel wäre sehr gut..


----------



## Leroy42 (1. Sep 2006)

:shock:  ???:L  :autsch:


----------



## Gast (1. Sep 2006)

eine asynchrone methode macht ihre arbeit in einem extra thread, benachrichtigen kannst du die klasse dann zum beispiel mit einem listener (siehe z.B. ActionListener)


----------



## koplop (1. Sep 2006)

???:L 

Listener geht doch aber nur mit wat oder swing? ich benütze aber keines von beiden...


----------



## Wildcard (1. Sep 2006)

Du kannst dir doch problemlos eigene Listener schreiben, mit AWT/Swing hat das nichts zu tun.


----------



## koplop (1. Sep 2006)

ich kenne es aber nur von awt/swing. Also wie würde den ein Listener aussehen, der auf den Empfang einer void Methode reagiert?

Kannst du mir da vielleicht ein Beispiel geben?


----------



## Gast (1. Sep 2006)

http://today.java.net/pub/a/today/2003/10/24/swing.html

Auf Seite 2: "The Solution: Event-Driven Programming"

da wird das sehr schön mit einem Beispiel erklärt.


----------



## koplop (2. Sep 2006)

hallo,

gibts da eigentlich auch was auf deutsch?
...also Listener benutzen, die auf Methoden hören, also keine Swing oder AWT Sachen..


----------



## Beni (2. Sep 2006)

Na schau dir doch an, wie das in Swing/AWT funktioniert... ein Interface das man implementieren muss, und ein paar Instanzen die in einer Liste gesammelt werden...


```
// Listener definieren
public interface Listener{
  public void bum();
}

// Listener implementieren
public class Irgendwo implements Listener{
  public void bum(){ ... }
}

public class Observed{
  private List<Listener> list = new ArrayList<Listener>();

  // Listener hinzufügen
  public void add( Listener x ){
    list.add( x );
  }

  // Listeners informieren, die Methode muss man halt vor irgendwoher aufrufen
  protected void fireEvent(){
    for( Listener x : list )
      x.bum();
  }
}
```


----------



## byte (2. Sep 2006)

Statt was eigenes zu schreiben, gibts auch eine fertige Lösung in der Java API mittels _java.util.Observer_ und _java.util.Observable_.


----------



## koplop (3. Sep 2006)

ja danke, ich werde es mal versuchen. Ich muss dazu sagen, das ich das benützen möchte, um einen Webservice asynchron aufzurufen.  Weiß aber nicht ob dies dann so geht, vielleicht benötigt man da noch speziellere Sachen?

aber trotzdem erstmal gute Antworten.
 :toll:


----------



## samo (4. Sep 2006)

hallo,

also das würde mich nun auch interessieren, ob man die Observable Geschichte so übernehmen kann, und in Webservices übertragen??

kennt sich da jemand aus?


----------



## byte (4. Sep 2006)

Hm, da gibts doch sicher spezielle J2EE Lösungen, um Webservices asynchron aufzurufen!? Hab das zumindest mal mit .NET gemacht und da gibts auf jeden Fall ne einfache fertige Lösung, um asynchron aufzurufen. Würde mich echt wundern, wenn man das in Java so proprietär mit Threads lösen müsste.


----------



## samo (4. Sep 2006)

byto hat gesagt.:
			
		

> Hm, da gibts doch sicher spezielle J2EE Lösungen, um Webservices asynchron aufzurufen!? Hab das zumindest mal mit .NET gemacht und da gibts auf jeden Fall ne einfache fertige Lösung, um asynchron aufzurufen. Würde mich echt wundern, wenn man das in Java so proprietär mit Threads lösen müsste.



ja die Java lösung würde mich natürlich auch intereseiren, aber wie sieht den die .NET Lösung aus? Also was brauch ich da alles? Mit C# hab ich mal was gemacht, ist aber schon länger her...


----------



## byte (4. Sep 2006)

Du brauchst das .NET Framework dafür. Frag mich aber nicht nach Details, das ist einfach zu lange her und die Sourcen finde ich jetzt auch nicht mehr. Der Code war zumindest in C# geschrieben. Aber das ist ja prinzipiell wurscht, welche .NET Sprache Du da verwendest.


----------



## samo (4. Sep 2006)

ja dann muss ich es wohl doch versuchen in Java zu machen. Aber da hab ich gleich mal nochne frage:
ich habe einen TomcatServer und Axis, und eclipse wtp, also ein ganz normalen Webservice bekomme ich schon hin. Jetzt habe ich aber gelesen, das man mit JMS asynchrone Nachrichten verschicken kann. Kann ich den JMS in meiner Umgebung benutzen? oder brauch da unbedingt  einen Applikationsserver?


----------



## Kola (4. Sep 2006)

Ich denke mal, dafür brauchst du eine JMS-Lösung (die in den Applikationservern enthalten ist). Vielleicht gibt's da auch was von Spring? de.search.yahoo.com/search?p=spring+framework+jms&fr=FP-tab-web-t340&ei=UTF-8&meta=vl%3D


----------



## samo (5. Sep 2006)

ja heißt das in Tomcat ist JMS enthalten? weil ich dachte Tomcat ist kein Aplikationsserver..  
oder brauche ich unbedingt einen Applikationsserver? wenn ja was ist den der einfachste Weg einen zu instlalieren, um dann ein einfaches Beispiel mit einem Webservice zu erstellen?


----------

