Java Reference
In-Depth Information
Listing 13.8 Implementierung der CounterProvider-Schnittstelle
package javacomp.ejb.counterprovider.server;
import javax.annotation.*;
import javax.ejb.*;
@Singleton(mappedName="CounterProvider")
public class CounterProviderImpl implements CounterProvider
{
private Counter counter;
public Counter getCounter()
{
return counter;
}
@PostConstruct
public void init()
{
counter = new Counter();
}
}
Wenn wir nun einen Client programmieren und uns darin das Zählerobjekt beschaff en,
können wir den Zähler wie erwartet erhöhen. Wenn wir uns aber das Zählerobjekt erneut
beschaff en, beginnt die Zählung wieder von vorne, obwohl es doch auf dem Server nur ein
einziges Counter-Objekt gibt:
Context context = new InitialContext();
CounterProvider cp =
(CounterProvider)context.lookup("CounterProvider");
Counter counter = cp.getCounter();
int value = counter.increment(); //value == 1
value = counter.increment(); //value == 2
counter = cp.getCounter();
value = counter.increment(); //value == 1 !!!!
Warum ist dies so? Die Antwort ist ganz einfach: Parameter und Rückgabewerte werden bei
externen EJB-Methodenaufrufen als Wert übergeben (Call-By-Value). Mit einem externen
EJB-Methodenaufruf ist ein Aufruf „von auß e n “ gemeint (später werden wir auch noch
interne EJB-Methodenaufrufe kennenlernen). Durch das Prinzip Call-By-Value bzw. Return-
By-Value wird bei jedem Aufruf von getCounter eine neue Kopie angefertigt, die auf dem
Client landet. Wenn der Client dann darauf increment aufru , erhöht sich zwar der Zähler,
aber eben nur in dem auf den Client kopierten Objekt, nicht im Original-Objekt auf dem
Server. Das heißt, dass man also in diesem Beispiel den Zähler auf dem Server grundsätz-
lich nicht ändern kann. Insofern ist das Beispiel ziemlich sinnlos. Aber es dient ja nur
Demonstrationszwecken. Auß erdem wird es im folgenden Abschnitt so verä ndert, dass sich
der Zähler auch auf dem Server hochzählen lässt.
Wegen der Wertrückgabe muss die Klasse Counter aus Listing 13.6 die Schnittstelle Seria-
lizable implementieren. Wird „implements Serializable“ weggelassen, so gibt es beim Auf-
ruf der Methode getCounter eine Ausnahme, da der Rückgabewert nicht serialisiert werden
kann. Die Implementierung von Serializable ist damit geklärt. Im folgenden Abschnitt wird
die Kennzeichnung der Methode increment durch synchronized begründet werden.
 
Search WWH ::




Custom Search