2010-12-09 52 views
0

J'ai essayé d'implémenter une méthode de classe singleton, qui est invoquée par une classe de filtre. La classe de filtre et le reste des classes sont ajoutés à WLS en tant que bibliothèque partagée.comment implémenter un singleton - dans weblogic

Et j'ai deux applications Web distinctes en cours d'exécution - servlets avec filtre - les deux sur le même serveur géré.

Ainsi, tout fonctionne correctement, sauf que le singleton est instancié deux fois. plz trouverez ci-dessous l'extrait de code.

public class Test 
{ 
    private static Test ref ; 

    private DataSource X; 
    static int Y; 
    long Z ; 


    private Test() 
    { 
     // Singleton 
    Z= 100 ; 
    } 

    public static synchronized Test getinstance() throws NamingException, SQLException 
    { 
     if(ref == null) 
     {   
     ref = new Test() ;   
     InitialContext ic = new InitialContext(); 

     ref.X = (DataSource)ic.lookup ("jdbc/Views"); 
     } 
     return ref ;  
    } 

    public Object clone()throws CloneNotSupportedException 
    { 
     throw new CloneNotSupportedException(); 
    } 

    public int sampleMethod (int X) throws SQLException 
    { 
    } 

} 

méthode du filtre:

public final class Filter implements Filter 
{ 
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException 
{ 
    try 
    { 
    Test ref = Test.getinstance(); 
    log.logNow(ref.toString()); 
    ....... 

    } 
} 
} 

Dans le journal me fais deux références différentes - par exemple

test @ f1a2e06 test @ f180f10

que je fais quelque chose qui cloche? Toute aide est la bienvenue.

+0

Quelle version de WebLogic est-ce? L'étiquette indique 10.x, mais cela pourrait être 10.0 ou 10.3 ou 11gR1 (10.3.x). –

+0

Un singleton fait d'ailleurs pas de sens absolu ici. Si vous voulez une seule instance par contexte de servlet, utilisez 'ServletContextListener'. Si vous voulez une seule instance par serveur d'applications, utilisez JNDI comme le suggère Bozho. – BalusC

+0

11gR1 (10.3.3). – Tom

Répondre

6

Un conteneur de servlets utilise différents chargeurs de classe pour différentes applications. Donc je ne crois pas qu'il soit possible de partager une instance. Ce que vous pouvez faire est peut-être d'enregistrer l'instance via JNDI.

+0

Bien sûr, vous pouvez toujours avoir votre classe singleton dans le (s) classloader (s) parent - p. dans Container classpath - alors il sera visible à toutes les applications du même Container et instancié une fois. Bien que je ne vais pas recommander cette approche pour plusieurs raisons, mais si vous devez l'avoir alors ... – maximdim

+0

merci pour les réponses. @ Bozho - Je suis un peu nouveau à cela. alors pourriez-vous me pointer dans la bonne direction? Comment enregistrer l'instance via JNDI? – Tom

+0

http://download.oracle.com/docs/cd/E11035_01/wls100/jndi/jndi.html voir ici – Bozho