# Ersatz für Thread.sleep() in EJBs?



## peez (21. Jan 2013)

Ich weiß, dass man in Stateless Session Beans keine sleeps verwenden soll. Der Grund leuchtet mir natürlich auch ein (Transaktionen, Thread-Management etc.).

Was wäre denn ein adäquater Ersatz für ein Sleep, wenn ich z.B. innerhalb einer Methode ein Fremdsystem mit einer Aktion beauftragen möchte, dieses z.B. in Zehn-sekunden-Abständen nach dem Status fragen und wenn es mit seiner Arbeit fertig ist, weiter im Programmablauf gehen möchte?

Also zum Beispiel sowas hier:

```
public class Bsp {
	public void doSomething() {

                //Irgendwas tun
		int a = 0;
		int b = 5*5;
		
                //Fremdsystem beauftragen
		fremdsystemClient.invokeTransferFile();
		
                //Mit 10 Sek. Pause immer wieder Status pollen
		while (fremdsystemClient.getTransferStatus() != FERTIG) {
			Thread.sleep(10000);
		}
		
                //Datei transferiert, weiter im Programm
		FileInputStream i = new FileInputStream(transferierteDatei);
	}
}
```


----------



## JimPanse (21. Jan 2013)

Timer


----------



## nillehammer (21. Jan 2013)

Wait/Notify könnte auch noch eine Alternative sein.


----------



## EinAlterGaast (21. Jan 2013)

Evtl. ist auch das was für dich:
Asynchronous Method Invocation - The Java EE 6 Tutorial


----------



## peez (23. Jan 2013)

Leider ist das Fremdsystem u.a. ein Webservice, d.h. wait/notify würde ich auf Anhieb sagen kommt nicht in Frage, da das Fremdsystem u.a. per Webservice aufgerufen wird, und nicht von sich aus über den Abschluss informieren kann.

Habe das jetzt mit Timer versucht, funktioniert auch, allerdings scheint er damit die Session / den Login zu verlieren.
Kann ich dem Timer evt. die aktuelle Usersession direkt mitgeben u. die dann beim Timeout wiederherstellen?


----------



## nillehammer (23. Jan 2013)

peez hat gesagt.:
			
		

> Leider ist das Fremdsystem u.a. ein Webservice, d.h. wait/notify würde ich auf Anhieb sagen kommt nicht in Frage, da das Fremdsystem u.a. per Webservice aufgerufen wird, und nicht von sich aus über den Abschluss informieren kann.


Das Fremdsystem selbst natürlich nicht, aber bei synchronen Webserviceaufrufen kann die Klasse, mit der Du den Aufruf machst (_fremdsystemClient_), das tun, wenn das Ergebnis vorliegt.

Bei asynchronen Webservice-Aufrufen könnte der Callback-Handler das übernehmen.


----------

