Newsgroup: it.comp.java
Titolo: application non basta.

Con Tomcat devo gestire due progetti. In sostanza ciascuno vive di vita
propria, ha la propria root (che per ipotesi chiameremo webapps/a e
webapps/b) e ciò che sta in A non interferisce con B.
E questo e' un problema: entrambi i progetti utilizzano la medesima dll che
va caricata con loadLibrary, comando che genera un'eccezione se si tenta di
rifare un load di una libreria gia' caricata.
Poco male, try-catch e in fondo si risolve. Ma le mie esigenze non finiscono
qui: sia il progetto A che il progetto B devono fare quanto segue:
- controllare che il thread pippo sia o meno in esecuzione.
- se non sta girando, occorre lanciarlo, altrimenti non bisogna far nulla.
il punto e' che il thread dev'essere unico per entrambi i progetti. Se fosse
stato un progetto solo mi salvavo con un
application.setAttribute("thread",oggettothread), ed ad ogni esecuzione di
una jsp controllavo con getAttribute, reperivo l'istanza di oggettothread e
col metodo isAlive decidevo se eseguirlo o meno.
Purtroppo application.setAttribute funziona soltanto all'interno di un
singolo progetto. Cosi' se A da un application.setAttribute("thread",
oggettothread), una lettura di B con getAttribute("thread") mi restituisce
null, B interpreta questo come "il thread non e' mai stato creato, lo devo
lanciare", col risultato di avere due thread in esecuzione anziche' uno.
Sarebbe bello esistesse un oggetto piu' visibile di "application", un
"tomcat.setAttribute", ma non so se esite.
Come risolvereste voi?
Esiste una soluzione efficace?
Devo iniziare a valutare il passaggio a qualcosa tipo J2EE o similare?
Grazie infinite.

 ha scritto nel messaggio
news:bgtich$s8voc$1...@ID-173504.news.uni-berlin.de...




Se tutto gira sotto lo stesso Tomcat, non č un gran
problema, perchč la JVM č unica.
In tal caso puoi usare un Singleton:
public class SingletonThread implements Runnable
{
    private static Thread me;
    private int i=0;
 public void run()
    {
        while (Thread.currentThread()==me)
        {
      try
   {
    Thread.sleep(1000);
             if (i++==10) me=null;
             System.out.println(i);
   }catch (InterruptedException e)
   {
    me=null;
   }
        }
        me=null;
    }
   public static  synchronized void start()
    {
        if (me==null)
        {
            me=new Thread(new SingletonThread () );
            me.start();
        }
    }
   public static  synchronized void stop()
    {
  if (me!=null)
  {
         me.interrupt();
         me=null;
  }
    }
 public static void main(String [] args) throws Exception
 {
          SingletonThread.start();
          Thread.sleep(4500);
          SingletonThread.stop();
 }
}
Cosě dovrebbe andare, il thread č creato solo una volta
(nella JVM corrente) tramite il metodo statico start.
CarloP.

 In tal caso puoi usare un Singleton:
Mi spiace contraddirti, ma anche se la JVM è unica le "web application" 
girano in "spazi" (non so qual'e' il termine corretto) separati e gli 
attributi statici non sono condivisi fra due di esse.
Se non mi sbaglio viene utilizzato un classloader diverso per ogni 
applicazione ed e' questo a causare questa separazione.
Andrea Polci

 attributi statici non sono condivisi fra due di esse.
Vero, non ci pensavo.
Ma basta mettere il class in:
$CATALINA_HOME/shared/classes
o il jar in:
$CATALINA_HOME/shared/lib
Questo classloader è condiviso da TUTTE le webapps
CarloP.