Thread-Synchronisation bei Stateful Session Beans

eddie_g

Grünschnabel
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.

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
 

Neue Beiträge

Zurück