Auf "Dienste" zugreifen von EJBs

mcdroemmel

Mitglied
Hallo zusammen,

seit einiger Zeit entwickele ich unter JEE5 (fürs UI Servlets und SAP-WebDynpro, und für die Business-Logik mit EJBs 3.0) .

Jetzt möchte ich ganz gern in meiner Anwendung Caching verwenden. Dazu gibt es z.B. Apache JCS um einen Cache zu realisieren.
Ich möchte von meinen (stateless) EJBs jeweils dann auf diesen Cache zugreifen.
Meine Frage, weil ich es noch nie gemacht habe und mir noch nicht so über den Weg gelaufen ist.
Wie kann man unter JEE5 eine Art Dienst realisieren? Mit einer EJB (egal ob stateless oder statefull) wohl nicht. So muss der Cache (bzw diverse Objekte) ja über die gesamte Lebenszeit des Servers für Requests von Business-Logik EJBs leben.

Kann mir da jemand nen Tipp geben von wo aus ich dann weiter laufen/lesen kann?

Grüße
McD
 
Hm. Offenbar habe ich mein Anliegen noch nicht so recht rüber bringen können.

Also im Grunde möchte ich von einer Bean auf eine andere im Speicher für alle anfordernden Beans zur Laufzeit des Servers persistente Klasse zugreifen, die als Eigenschaften z.B. einen Datencache oder andere Attribute hält.
Mit einer Statefull Bean wird das doch nicht gehen, da diese doch nur den Zustand während ihres Gebrauchs hält.

Vielleicht ein einfaches Beispiel:

Eine einfach Klasse zum Speichern von Strings in einer ArrayList die aber persistent sein soll:

Code:
public Class MyCache {

 private ArrayList<String> cacheAsList;
 public MyCache ()
 {
   cacheAsList = new ArrayList<String>();
 }
 public void addToCache (String toAdd)
 {
    cacheAsList.add(toAdd);
 }
 public boolean isInCache (String toCheck)
 {
    return cacheAsList.contains(toCheck);
 }

}

Diese Klasse sollte irgendwie vom AppServer initialisiert werden beim Start.
Eine Business-Bean sollte dann Einträge in den Cache eintragen oder abfragen können.
Also z.B.
Code:
@Stateless
public class myClientBean {
 
 MyCache myCache; 
 ....
 public boolean checkIfinCache (String a)
 {
    return myCache.isInCache(a);
 }
 ...

}

Die Frage ist, wie man also die Klasse MyCache überhaupt realisiert. Sie müsste ja auch vom AppServer initialisiert werden. Und wie man sie dann in der Client-Bean verwendet.
Denn das Objekt myCache ist ja hier nicht expliziet instantiiert worden. Vielleicht mit einer Annotation wie bei den Beans ala @EJB oder wie eine Ressoure ala @Ressource?

Klar ist mir natürlich, dass man aufpassen muss (z.B. mit Locking oder Queueing, dass der Zugriff auf die Eigenschaften der Klasse MyCache serialisiert werden müsste.

Vielleicht fällt jemandem noch was ein?

Gruß
McD



Keine Ideen?
 
Hi,

also Du kannst Deinen Cache - wenn er selbst geschrieben und ohne Bean-Referenzen ist - in einem static initializer initialisieren. Das Unschöne ist dabei, dass der Zugriff dann ebenfalls static sein wird und Du selbst locking machen musst.

Mit EJB3.1 geht das (da gibts ein @Singleton sowie @Lock sowie ein @Startup, welches beim Deploy ausgeführt wird). Falls Du mit JBoss arbeitest kannst Du direkt den JBoss cache nutzen, dazu musst Du nur den CacheManager starten. Wenn Du Model-Beans cachen willst, kannst Du das auch mittels @Cacheable erreichen.

Bei EJB3.0 würde ich wie folgt vorgehen :

Code:
@Stateless
public class ApplicationCache implements ... 

private static Cache cache = new Cache();

@PostConstruct
public void afterSetup() {
 synchronized(cache) {
 cache.initialisieren();
}

public void put(String key, Object obj) {
synchronized(cache) {
 cache.put(key,obj)
 }
}

}

Damit machst Du ein Bean zur Fassade für Deinen statischen Cache, was imo architektonisch sauberer ist, da Du Dir dieses Bean ganz normal per Injection holen kannst und es den statischen Zugriff sauber kapselt.

Grüße,
gore
 
Zurück