[Tomcat] Eine Bean in allen Web-Applikationen verwenden / sharen

Um ein und dieselbe Instanz einer Bean (oder eine Klasse) in alle Web-Anwendungen, die in einem Tomcat laufen, zu verwenden, muss man so vorgehen:

1. Eine Bean erstellen, die das Singleton-Pattern implementiert
2. Passende BeanFactory erstellen, die die Singleton-Instanz zurückgibt
3. Beides nach $tomcat_home/common kopieren
4. Die Bean als Resource in der server.xml des Tomcat hinzufügen
5. ResourceLink für die Factory in die context.xml des Tomcat einfügen
6. web.xml der Web-Anwendung anpassen
7. Bean-Instanz in Web-Anwendung laden


Die Details:

1. Eine Bean erstellen, die das Singleton-Pattern implementiert:

package de.littlelittle;

public class MyBean
{
private static MyBean instance;

public synchronized static MyBean getInstance()
{
if(instance == null)
{
instance = new MyBean();
}
return instance;
}

private MyBean()
{
// .. do constructor stuff
}

//.. more methods
}

2. Passende BeanFactory erstellen, die die Singleton-Instanz zurückgibt:

package de.littlelittle;

import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.Name;
import javax.naming.NamingException;
import javax.naming.spi.ObjectFactory;

public class MyBeanFactory implements ObjectFactory {

public Object getObjectInstance(Object obj,
Name name, Context nameCtx, Hashtable environment)
throws NamingException {

// Acquire an instance of our specified bean class
MyBean bean = MyBean.getInstance();

// Return the customized instance
return (bean);

}
}

3. Beides nach $tomcat_home/common/classes (oder wenn die Klassen in eine jar gepackt sind: $tomcat_home/common/lib) kopieren.

4. Die Bean als Resource in der server.xml des Tomcat hinzufügen (in $tomcat_home/conf), innerhalb des Elements <GlobalNamingResources>:

<Resource name="bean/myBeanFactory" auth="Container"
type="de.littlelittle.MyBean"
factory="de.littlelittle.MyBeanFactory" />

5. Folgende Zeile in der context.xml des Tomcat (in $tomcat_home/conf) hinzufügen:
<ResourceLink name="bean/myBeanFactory" global="bean/myBeanFactory" />

6. In der web.xml der Web-Anwendung, die die Instanz dieser Bean nutzen soll:

<resource-env-ref>
<description>Object factory for MyBean instance.</description>
<resource-env-ref-name>bean/myBeanFactory</resource-env-ref-name>
<resource-env-ref-type>de.littlelittle.MyBean</resource-env-ref-type>
</resource-env-ref>

7. Bean-Instanz laden, z.B. innerhalb des Javacodes einer JSF-BackingBean:

try
{
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
MyBean myBeanInstance = (MyBean) envCtx.lookup("bean/MyBeanFactory");
}
catch (NamingException e)
{
e.printStackTrace();
}

Bei Starten des Tomcats wird die Factory schon das erste Mal aufgerufen und somit die Instanz der Bean angelegt! Allen Anwendungen steht diese Instanz dann zur Verfügung.

Hinterlasse eine Antwort

Du musst angemeldet sein, um einen Kommentar zu erstellen.