Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Analogo del metodo init() al di fuori delle servlet

    Ciao a tutti!

    Come be sapete se avete letto gli altri due 3d che ho aperto, sono un completo novizio del mondo Java (un mondo fantastico, a giudicare da quello che apprendo giorno dopo giorno visto i servizi che offre) e quindi prima di insultarmi per il quesito che vi sto per porre mettetevi non una, ma cento mani sul cuore.

    Dunque, la mia domanda è questa: le servlet mettono a disposizione il metodo init() che viene eseguito solo una volta dal container e nel quale si possono inizializzare varie operazioni (nel mio caso l'inizializzazione di un oggetto chiamato Provider che richiede circa 5 secondi e quindi ho un grandissimo vantaggio). Se volessi portare tutto questo al di fuori di una applicazione web, ovvero creare un file .jar eseguibile che gira in locale sul pc dell'utente senza interagire con un Web Server/Web Container, Java mi offre la possibilità di avere un analogo del metod init() delle servlet? Se si, mi sapreste indicare la via o qualche link dove possa prendere maggiori informazioni?

    Grazie e ciao!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Analogo del metodo init() al di fuori delle servlet

    Originariamente inviato da classiFICO
    Se volessi portare tutto questo al di fuori di una applicazione web, ovvero creare un file .jar eseguibile che gira in locale sul pc dell'utente senza interagire con un Web Server/Web Container, Java mi offre la possibilità di avere un analogo del metod init() delle servlet?
    Allora, la questione è posta un po' male, forse anche a causa di basi non solide.
    Facciamo un discorso più generale.

    A livello di Java, di virtual machine, il ciclo di vita di un oggetto qualunque è semplice/minimale: lo si istanzia con new Xyz() (o new Xyz[....] per gli array) e quando l'oggetto non sarà più "raggiungibile" allora diventa eleggibile per il garbage collection. Punto.

    Qualunque cosa di più che detta il ciclo di vita di un oggetto in modo più particolare come ad esempio una ben precisa sequenza di invocazione di certi metodi, lo può stabilire una specifica.
    Per Java EE c'è una specifica che descrive e impone che le entità come le servlet o i filter sono oggetti gestiti dal container. Questi oggetti devono implementare una certa interfaccia ben precisa per poter essere riconosciuti dal container, che quindi istanzia l'oggetto e ne invoca man mano i metodi salienti per il suo ciclo di vita.
    Ma è per via di come è stato scelto e stabilito. Cioè è così e va fatto così.

    Quindi tu cosa vuoi fare? Una applicazione "standalone" che non centra nulla con servlet e altra "roba" di Java EE?
    In questo caso non ci sono specifiche particolari, l'unica al massimo è che in una applicazione standalone ci deve essere una classe che ha un metodo public static void main(String[] args) che fa da "entry-point". Ma è tutto qui.
    Una volta che il main() stato lanciato, tutto il resto è a tuo carico e puoi fare come ti pare a livello di oggetti e del loro ciclo di vita.
    Quindi sei tu che devi stabilire quando istanziare oggetti o inizializzare le cose. E qui le regole che valgono sono quelle della OOP e i suoi principi fondamentali di buona programmazione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    alcune aggiunte, se vuoi ricercare riferimenti sul web: i metodi usati per creare un'istanza di un oggetto prendono il nome di costruttori.

    Se vuoi simulare un ciclo di vita simile a quello delle servlet (singola istanza e garanzia che un metodo di inizializzazione, in questo caso il costruttore, venga invocato una e una sola volta) puoi cercare informazioni sul design pattern "singleton"

    ciao
    Ivan Venuti
    Vuoi scaricare alcuni articoli sulla programmazione, pubblicati su riviste di informatica? Visita http://ivenuti.altervista.org/articoli.htm. Se vuoi imparare JavaScript leggi il mio libro: http://www.fag.it/scheda.aspx?ID=21754 !

  4. #4
    Wow! Rimango sempre più sbalordito dalla disponibilità che avete nel dare suggerimenti/consigli e soprattutto dalla velocità con cui lo fate (ben due risposte in un'ora!)! Questo è di gran lunga il miglior forum che abbia frequentato.

    Veniamo alla mia situazione, non prima però di aver ringraziato sia andbin che ivenuti per i loro dettagliatissimi post.Mi rendo conto che nel mio primo post sono stato un po' troppo generico e quindi vi spiego la mia situazione: ho scritto una servlet che permette di effettuare delle chiamate/conferenze VoIP appoggiandosi a un programma che si chiama Cisco CUCM (ex Cisco Call Manager) che svolge il ruolo di un PBX ( clicca qui ). Affinchè possa partire la chiamata bisogna instanziare vari oggetti, fra i quali uno che si chiama Provider e che ci mette circa 5 secondi a svolgere l'intera operazione. Per curiosità vostra vi incollo le istruzioni che fanno tutto questo:

    codice:
                 
                            JtapiPeer peer = JtapiPeerFactory.getJtapiPeer(null);
     
             		  /* Connessione al Provider */
    		         String providerString = server_name;
    		         providerString += ";login=" + user_jtapi;
    		         providerString += ";passwd=" + password_jtapi;
    		         Provider provider = peer.getProvider(providerString);
     
            	         /* Attendi che entri in servizio */
            		 final Condition	inService = new Condition();
            		 provider.addObserver(new ProviderObserver() {
    	                 public void providerChangedEvent (ProvEv [] eventList) {
    			           if (eventList == null) return;
    				           for (int i = 0; i < eventList.length; ++i) {
    					           if (eventList[i] instanceof ProvInServiceEv) {
    					             inService.set();
    				             }    
    			             }
    		           }
    		         });
    		         inService.waitTrue();
    Grazie al metodo init() delle servlet questa parte di codice viene eseguita una sola volta, la prima volta che il metodo doPost() viene "chiamato" e quindi a partire dalla seconda telefonata non devo più attendere quei fantomatici 5 secondi prima che parta la telefonata.

    A questo punto mi è stato chiesto se sia possibile adattare il codice che ho scritto per la servlet per creare un semplice eseguibile che giri in locale, e quindi non c'entri nulla con il mondo web, che si attivi semplicemente facendo un doppio click a un file .jar. Ovviamente la cosa è fattibile, però ogni volta che avvio la telefonata devo perdere quei 5 secondi. Io volevo semplicemente sapere se fosse stato possibile istanziare il provider una sola volta, la prima volta che facciamo una telefonata e dalla seconda volta in poi non essere più costretti ad attendere. Questo, a quanto ho capito, mi pare non sia possibile. Pazienza, me ne farò una ragione!

    Ciao!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.