Hallo. Ich habe folgendes Problem : Ich möchte von einem Client aus in einer Stateful Session Bean (ab jetzt SFSB genannt) eine Methode aufrufen, welche einer ihrer Membervariablen hochzählt (Bean-Methode : 'doSet()'). Dieser Aufruf passiert in einem Thread.
Hier der Client-Code (starten tut alles in Konstruktor) :
Wenn der Setter-Thread fertig ist, setzt er die boolsche Variable auf true. Solange das nicht passiert ist, versucht der Haupt-Thread, Werte per get()... auszulesen.
Anmerkung : Das Remote-Interface ist in der Klasse 'TestClientStatics' statisch.
Der weiterlaufende Haupt-Thread soll dann immer wieder den Wert der gesetzten Membervariablen abfragen (Bean-Methode : 'doGet()').
Das Problem ist, das ich offensichtlich mit 2 verschiedenen SFSB rede (Zu sehen an dem jew. in den Bean-Methoden ausgegebenen Hascodes).
Hier der Code der Bean :
Die serverseitige Ausgabe sieht etwa so aus (an dem ausgebenen Hashcode sieht man, dass es definitiv zwei Bean-Instanzen sind - 16946045 liest und 32615109 schreibt) :
11:22:14,355 INFO [STDOUT] Value wird auf 0 gesetzt, Object-ID : 32615109
11:22:14,355 INFO [STDOUT] Value wird geholt (-1), Object-ID : 16946045
11:22:14,870 INFO [STDOUT] Value wird auf 1 gesetzt, Object-ID : 32615109
11:22:14,870 INFO [STDOUT] Value wird geholt (-1), Object-ID : 16946045
11:22:15,370 INFO [STDOUT] Value wird auf 2 gesetzt, Object-ID : 32615109
11:22:15,386 INFO [STDOUT] Value wird geholt (-1), Object-ID : 16946045
11:22:15,870 INFO [STDOUT] Value wird auf 3 gesetzt, Object-ID : 32615109
11:22:15,886 INFO [STDOUT] Value wird geholt (-1), Object-ID : 16946045
11:22:16,370 INFO [STDOUT] Value wird auf 4 gesetzt, Object-ID : 32615109
11:22:16,386 INFO [STDOUT] Value wird geholt (-1), Object-ID : 16946045
11:22:16,870 INFO [STDOUT] Value wird auf 5 gesetzt, Object-ID : 32615109
11:22:16,886 INFO [STDOUT] Value wird geholt (-1), Object-ID : 16946045
11:22:17,370 INFO [STDOUT] Value wird auf 6 gesetzt, Object-ID : 32615109
11:22:17,401 INFO [STDOUT] Value wird geholt (-1), Object-ID : 16946045
11:22:17,870 INFO [STDOUT] Value wird auf 7 gesetzt, Object-ID : 32615109
11:22:17,901 INFO [STDOUT] Value wird geholt (-1), Object-ID : 16946045
11:22:18,370 INFO [STDOUT] Value wird auf 8 gesetzt, Object-ID : 32615109
11:22:18,417 INFO [STDOUT] Value wird geholt (-1), Object-ID : 16946045
11:22:18,870 INFO [STDOUT] Value wird auf 9 gesetzt, Object-ID : 32615109
11:22:18,917 INFO [STDOUT] Value wird geholt (-1), Object-ID : 16946045
Gibt es eine Möglichkeit, es so einzurichten, das ich, obwohl ich das Remote-Interface (und damit die Bean) von verschiedenen Threads ausanspreche, immer dieselbe SFSB bekomme ? Wenn ich das ganze ohne Client-seitiges Threading mache, funktioniert es.
Das hilft mir aber nicht, weil ich in meinem Client eine Progress-Bar einbauen möchte, welche den Status der serverseitigen Abarbeitung darstellt.
Hat jemand eine Idee ?
Danke im Voraus,
Stefan
Hier der Client-Code (starten tut alles in Konstruktor) :
Wenn der Setter-Thread fertig ist, setzt er die boolsche Variable auf true. Solange das nicht passiert ist, versucht der Haupt-Thread, Werte per get()... auszulesen.
PHP:
package xyz;
import org.apache.log4j.Logger;
public class TestClient {
private static Logger logger = Logger.getLogger("applogger");
private Thread setterThread = new Thread() {
public void run() {
TestClientStatics.remoteInterface.doSet();
setValueSettingDone(true);
}
};
/** Überwachen, ob der Setter-Thread schon durch ist */
private boolean valueSettingDone = false;
public TestClient() {
super();
setterThread.start();
while (!isValueSettingDone()) {
logger.debug("GET : " +
TestClientStatics.remoteInterface.doGet());
try {
Thread.sleep(500);
} catch (InterruptedException e) {
System.out.println("Fehler...");
}
}
}
private boolean isValueSettingDone() {
return this.valueSettingDone;
}
private void setValueSettingDone(boolean newValueSettingDone) {
this.valueSettingDone = newValueSettingDone;
}
}
Anmerkung : Das Remote-Interface ist in der Klasse 'TestClientStatics' statisch.
Der weiterlaufende Haupt-Thread soll dann immer wieder den Wert der gesetzten Membervariablen abfragen (Bean-Methode : 'doGet()').
Das Problem ist, das ich offensichtlich mit 2 verschiedenen SFSB rede (Zu sehen an dem jew. in den Bean-Methoden ausgegebenen Hascodes).
Hier der Code der Bean :
PHP:
package xyz;
import javax.ejb.Remote;
import javax.ejb.Stateful;
import org.jboss.annotation.ejb.LocalBinding;
import org.jboss.annotation.ejb.RemoteBinding;
@Stateful
@Remote(TestRemote.class)
@RemoteBinding(jndiBinding = "xxx/remote/TestBean")
@LocalBinding(jndiBinding = "xxx/TestBean")
public class TestBean implements TestLocal {
private int value = -1;
@Override
public void doSet() {
for (int i=0;i<10;i++) {
System.out.println("Value wird auf "+i+" gesetzt, Object-ID : " + hashCode());
setValue(i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
System.out.println("Fehler...");
}
}
}
private void setValue(int newValue) {
this.value = newValue;
}
@Override
public int doGet() {
System.out.println("Value wird geholt ("+this.value+"), Object-ID : " + hashCode());
return this.value;
}
}
Die serverseitige Ausgabe sieht etwa so aus (an dem ausgebenen Hashcode sieht man, dass es definitiv zwei Bean-Instanzen sind - 16946045 liest und 32615109 schreibt) :
11:22:14,355 INFO [STDOUT] Value wird auf 0 gesetzt, Object-ID : 32615109
11:22:14,355 INFO [STDOUT] Value wird geholt (-1), Object-ID : 16946045
11:22:14,870 INFO [STDOUT] Value wird auf 1 gesetzt, Object-ID : 32615109
11:22:14,870 INFO [STDOUT] Value wird geholt (-1), Object-ID : 16946045
11:22:15,370 INFO [STDOUT] Value wird auf 2 gesetzt, Object-ID : 32615109
11:22:15,386 INFO [STDOUT] Value wird geholt (-1), Object-ID : 16946045
11:22:15,870 INFO [STDOUT] Value wird auf 3 gesetzt, Object-ID : 32615109
11:22:15,886 INFO [STDOUT] Value wird geholt (-1), Object-ID : 16946045
11:22:16,370 INFO [STDOUT] Value wird auf 4 gesetzt, Object-ID : 32615109
11:22:16,386 INFO [STDOUT] Value wird geholt (-1), Object-ID : 16946045
11:22:16,870 INFO [STDOUT] Value wird auf 5 gesetzt, Object-ID : 32615109
11:22:16,886 INFO [STDOUT] Value wird geholt (-1), Object-ID : 16946045
11:22:17,370 INFO [STDOUT] Value wird auf 6 gesetzt, Object-ID : 32615109
11:22:17,401 INFO [STDOUT] Value wird geholt (-1), Object-ID : 16946045
11:22:17,870 INFO [STDOUT] Value wird auf 7 gesetzt, Object-ID : 32615109
11:22:17,901 INFO [STDOUT] Value wird geholt (-1), Object-ID : 16946045
11:22:18,370 INFO [STDOUT] Value wird auf 8 gesetzt, Object-ID : 32615109
11:22:18,417 INFO [STDOUT] Value wird geholt (-1), Object-ID : 16946045
11:22:18,870 INFO [STDOUT] Value wird auf 9 gesetzt, Object-ID : 32615109
11:22:18,917 INFO [STDOUT] Value wird geholt (-1), Object-ID : 16946045
Gibt es eine Möglichkeit, es so einzurichten, das ich, obwohl ich das Remote-Interface (und damit die Bean) von verschiedenen Threads ausanspreche, immer dieselbe SFSB bekomme ? Wenn ich das ganze ohne Client-seitiges Threading mache, funktioniert es.
Das hilft mir aber nicht, weil ich in meinem Client eine Progress-Bar einbauen möchte, welche den Status der serverseitigen Abarbeitung darstellt.
Hat jemand eine Idee ?
Danke im Voraus,
Stefan