2010-12-09 6 views
0

Ich habe versucht, eine Singleton-Klasse-Methode, die von einer Filterklasse aufgerufen wird, zu implementieren. Die Filterklasse und der Rest der Klassen werden WLS als gemeinsam genutzte Bibliothek hinzugefügt.Wie ein Singleton zu implementieren - in Weblogic

Und ich habe zwei separate Web-Anwendungen laufen - Servlets mit Filter - beide auf dem gleichen verwalteten Server.

Also alles funktioniert gut außer, das Singleton wird zweimal instanziiert. PLZ finden Sie unter dem Code-Snippet.

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 
    { 
    } 

} 

Filter-Methode:

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()); 
    ....... 

    } 
} 
} 

Im Protokoll ist immer zwei verschiedene Referenzen - sagt

-Test @ f1a2e06-Test @ f180f10

Bin ich etwas falsch hier? Jede Hilfe wäre großartig.

+0

Welche Version von WebLogic ist das? Das Tag zeigt 10.x an, aber das könnte 10.0 oder 10.3 oder 11gR1 (10.3.x) sein. –

+0

Ein Singleton macht übrigens hier keinen Sinn. Wenn Sie eine einzelne Instanz pro Servletkontext verwenden möchten, verwenden Sie 'ServletContextListener'. Wenn Sie eine einzelne Instanz pro Anwendungsserver wünschen, verwenden Sie JNDI, wie Bozho es empfiehlt. – BalusC

+0

11gR1 (10.3.3). – Tom

Antwort

6

Ein Servlet-Container verwendet verschiedene Classloader für unterschiedliche Anwendungen. Ich glaube also nicht, dass es möglich ist, eine Instanz zu teilen. Sie können die Instanz vielleicht über JNDI registrieren.

+0

Natürlich können Sie Ihre Singleton-Klasse immer in Eltern-Classloader (s) haben - z. in Container classpath - dann wird es für alle Anwendungen im selben Container sichtbar sein und einmal instanziiert sein. Obwohl ich diesen Ansatz aus vielen Gründen nicht empfehlen werde, aber wenn Sie es dann haben müssen ... – maximdim

+0

danke für die Antworten. @ Bozho - Ich bin irgendwie neu dazu. Könntest du mir in die richtige Richtung zeigen? Wie registriere ich die Instanz über JNDI? – Tom

+0

http://download.oracle.com/docs/cd/E11035_01/wls100/jndi/jndi.html siehe hier – Bozho

Verwandte Themen