Sviluppo di applicazioni che utilizzano JNDI
I riferimenti alle home EJB (enterprise bean) e ad altre risorse come le origini dati sono collegati allo spazio dei nomi WebSphere® Application Server . Questi oggetti possono essere ottenuti tramite JNDI (Java™ Naming e Directory Interface). Prima di poter eseguire qualsiasi operazione JNDI, è necessario ottenere un contesto iniziale. È possibile utilizzare il contesto iniziale per ricercare gli oggetti collegati allo spazio nome.
Informazioni su questa attività
In questi esempi, viene utilizzato il comportamento predefinito delle funzioni specifiche per l'implementazione del contesto JNDI WebSphere Application Server .
L'implementazione del contesto JNDI WebSphere Application Server include funzioni speciali. La memorizzazione nella cache JNDI migliora le prestazioni delle operazioni di ricerca ripetute sugli stessi oggetti. Le opzioni di sintassi dei nomi offrono una selezione di sintassi dei nomi, una ottimizzata per i client JNDI tipici e una ottimizzata per l'interoperabilità con le applicazioni CosNaming . Il più delle volte, il comportamento predefinito di queste funzioni è il comportamento preferito. Tuttavia, a volte è necessario modificare il funzionamento per situazioni specifiche.
Le opzioni della sintassi del nome e della memorizzazione nella cache JNDI sono associate a un'istanza javax.naming.InitialContext . Per selezionare opzioni per queste funzioni, impostare le proprietà riconosciute dalla factory di contesto iniziale WebSphere Application Server . Per impostare la cache JNDI o le proprietà della sintassi del nome che saranno visibili al produttore del contesto iniziale, effettuare le seguenti operazioni:
Procedura
- Facoltativo: Configura cache JNDI
La memorizzazione nella cache JNDI può aumentare notevolmente le prestazioni delle operazioni di ricerca JNDI. Per impostazione predefinita, la memorizzazione nella cache JNDI è abilitata. Nella maggior parte delle situazioni, questo valore predefinito è il comportamento desiderato. Tuttavia, in situazioni specifiche, utilizzare altre opzioni della cache JNDI.
Gli oggetti vengono memorizzati nella cache locale quando vengono cercati. Le ricerche successive sugli oggetti memorizzati nella cache vengono risolte localmente. Tuttavia, il contenuto della cache può diventare obsoleto. Questa situazione di solito non è un problema, poiché la maggior parte degli oggetti che si cercano non cambia frequentemente. Se è necessario ricercare oggetti che cambiano relativamente frequentemente, modificare le opzioni della cache JNDI.
I client JNDI possono utilizzare diverse proprietà per controllare il comportamento della cache.
È possibile impostare le proprietà:- Dalla riga comandi immettendo il valore stringa effettivo. Ad esempio:
java -Dcom.ibm.websphere.naming.jndicache.maxentrylife=1440 - In un file jndi.properties creando un file denominato jndi.properties come file di testo con le impostazioni delle proprietà desiderate. Ad esempio:
... com.ibm.websphere.naming.jndicache.cacheobject=none ...Se si utilizza questa tecnica, tenere presente che altre istanze del file jndi.properties potrebbero esistere nel percorso classi e potrebbero contenere impostazioni di proprietà in conflitto. Le impostazioni delle proprietà sono determinate dall'ordine in cui il programma di caricamento classi raccoglie i file jndi.properties . Non è possibile controllare l'ordine utilizzato dal programma di caricamento classi per individuare i file nel percorso classi. WebSphere Application Server inizialmente non contiene o crea alcun file jndi.properties che imposta la proprietà com.ibm.websphere.naming.jndicache.cacheobject .
- All'interno di un programma Java utilizzando PROPS.JNDI_CACHE* costanti Java, definite nel file com.ibm.websphere.naming.PROPS . Di seguito sono riportate le definizioni delle costanti:
public static final String JNDI_CACHE_OBJECT = "com.ibm.websphere.naming.jndicache.cacheobject"; public static final String JNDI_CACHE_OBJECT_NONE = "none"; public static final String JNDI_CACHE_OBJECT_POPULATED = "populated"; public static final String JNDI_CACHE_OBJECT_CLEARED = "cleared"; public static final String JNDI_CACHE_OBJECT_DEFAULT = JNDI_CACHE_OBJECT_POPULATED; public static final String JNDI_CACHE_NAME = "com.ibm.websphere.naming.jndicache.cachename"; public static final String JNDI_CACHE_NAME_DEFAULT = "providerURL"; public static final String JNDI_CACHE_MAX_LIFE = "com.ibm.websphere.naming.jndicache.maxcachelife"; public static final int JNDI_CACHE_MAX_LIFE_DEFAULT = 0; public static final String JNDI_CACHE_MAX_ENTRY_LIFE = "com.ibm.websphere.naming.jndicache.maxentrylife"; public static final int JNDI_CACHE_MAX_ENTRY_LIFE_DEFAULT = 0;Per utilizzare le proprietà precedenti in un programma Java, aggiungere l'impostazione della proprietà ad una tabella hash e inoltrarla al costruttore InitialContext nel modo seguente:
java.util.Hashtable env = new java.util.Hashtable(); ... // Disable caching env.put(PROPS.JNDI_CACHE_OBJECT, PROPS.JNDI_CACHE_OBJECT_NONE); ... javax.naming.Context initialContext = new javax.naming.InitialContext(env);
Di seguito sono riportati esempi che illustrano come utilizzare le proprietà della cache JNDI per ottenere il comportamento della cache desiderato. Le proprietà della cache diventano effettive quando viene creato un oggetto InitialContext .
Esempio: controllo del comportamento della cache JNDI da un programma
import java.util.Hashtable; import javax.naming.InitialContext; import javax.naming.Context; import com.ibm.websphere.naming.PROPS; /***** Caching discussed in this section pertains to the WebSphere Application Server initial context factory. Assume the property, java.naming.factory.initial, is set to "com.ibm.websphere.naming.WsnInitialContextFactory" as a java.lang.System property. *****/ Hashtable env; Context ctx; // To clear a cache: env = new Hashtable(); env.put(PROPS.JNDI_CACHE_OBJECT, PROPS.JNDI_CACHE_OBJECT_CLEARED); ctx = new InitialContext(env); // To set a cache's maximum cache lifetime to 60 minutes: env = new Hashtable(); env.put(PROPS.JNDI_CACHE_MAX_LIFE, "60"); ctx = new InitialContext(env); // To turn caching off: env = new Hashtable(); env.put(PROPS.JNDI_CACHE_OBJECT, PROPS.JNDI_CACHE_OBJECT_NONE); ctx = new InitialContext(env); // To use caching and no caching: env = new Hashtable(); env.put(PROPS.JNDI_CACHE_OBJECT, PROPS.JNDI_CACHE_OBJECT_POPULATED); ctx = new InitialContext(env); env.put(PROPS.JNDI_CACHE_OBJECT, PROPS.JNDI_CACHE_OBJECT_NONE); Context noCacheCtx = new InitialContext(env); Object o; // Use caching to look up home, since the home should rarely change. o = ctx.lookup("com/mycom/MyEJBHome"); // Narrow, etc. ... // Do not use cache if data is volatile. o = noCacheCtx.lookup("com/mycom/VolatileObject"); // ...Esempio: ricerca di una sessione JavaMail con JNDI
Il seguente esempio mostra una ricerca di una risorsa JavaMail :
// Get the initial context as shown previously ... Session session = (Session) initialContext.lookup("java:comp/env/mail/MailSession"); - Dalla riga comandi immettendo il valore stringa effettivo. Ad esempio:
- Facoltativo: Specificare la sintassi del nome
La sintassi INS è progettata per i client JNDI che devono interagire con le applicazioni CORBA. Questa sintassi consente a un client JNDI di creare l'associazione corretta da e verso un nome CORBA. La sintassi INS è molto simile alla sintassi JNDI con il carattere speciale aggiuntivo, punto (.). I punti vengono utilizzati per delimitare i campi ID e tipo in un componente nome. Un punto viene interpretato letteralmente quando viene preceduto da un carattere di escape. In un componente nome è consentito un solo punto senza carattere di escape. Un componente nome con un campo ID non vuoto e un campo tipo vuoto è rappresentato solo con il valore del campo ID e non deve terminare con un punto senza escape. Un componente nome vuoto (id vuoto e campo tipo vuoto) è rappresentato con un singolo punto senza escape. Una stringa vuota non rappresenta un componente nome valido.
Sintassi nome JNDI è la sintassi predefinita ed è adatta per i tipici client JNDI. Questa sintassi include i seguenti caratteri speciali: barra (/) e barra rovesciata (\). I componenti in un nome sono delimitati da una barra. La barra retroversa viene utilizzata come carattere escape. Una barra viene interpretata letteralmente se viene preceduta da una barra rovesciata. Allo stesso modo, una barra rovesciata viene interpretata letteralmente se viene preceduti da un carattere di escape.
La maggior parte delle applicazioni WebSphere utilizza JNDI per ricercare oggetti EJB e non è necessario ricercare oggetti collegati da applicazioni CORBA. Pertanto, la sintassi del nome predefinita utilizzata per i nomi JNDI è la più conveniente. Se l'applicazione deve ricercare gli oggetti collegati dalle applicazioni CORBA, potrebbe essere necessario modificare la sintassi del nome in modo che tutti i nomi CORBA CosNaming possano essere rappresentati.
I client JNDI possono impostare la sintassi del nome impostando una proprietà. L'impostazione della propriet ... viene applicata dalla produzione del contesto iniziale quando si crea un'istanza di un nuovo oggetto java.naming.InitialContext . I nomi specificati nelle operazioni JNDI sul contesto iniziale vengono analizzati in base alla sintassi del nome specificata.
È possibile impostare la proprietà:
- Da una riga comandi, immettere il valore stringa effettivo. Ad esempio:
java -Dcom.ibm.websphere.naming.name.syntax=ins - Creare un file denominato jndi.properties come file di testo con le impostazioni delle proprietà desiderate. Ad esempio:
... com.ibm.websphere.naming.name.syntax=ins ...Se si utilizza questa tecnica, tenere presente che altre istanze del file jndi.properties potrebbero esistere nel percorso classi e potrebbero contenere impostazioni di proprietà in conflitto. Le impostazioni delle proprietà sono determinate dall'ordine in cui il programma di caricamento classi raccoglie i file jndi.properties . Non è possibile controllare l'ordine utilizzato dal programma di caricamento classi per individuare i file nel percorso classi. WebSphere Application Server inizialmente non contiene o non crea alcun file jndi.properties che imposta la proprietà com.ibm.websphere.naming.name.syntax .
- Utilizzare PROPS.NAME_SYNTAX* Costanti Java, definite nel file com.ibm.websphere.naming.PROPS , in un programma Java. Di seguito sono riportate le definizioni delle costanti:
public static final String NAME_SYNTAX = "com.ibm.websphere.naming.name.syntax"; public static final String NAME_SYNTAX_JNDI = "jndi"; public static final String NAME_SYNTAX_INS = "ins";Per utilizzare le proprietà precedenti in un programma Java, aggiungere l'impostazione della proprietà ad una tabella hash e inoltrarla al costruttore InitialContext nel modo seguente:
java.util.Hashtable env = new java.util.Hashtable(); ... env.put(PROPS.NAME_SYNTAX, PROPS.NAME_SYNTAX_INS); // Set name syntax to INS ... javax.naming.Context initialContext = new javax.naming.InitialContext(env);
Esempio: impostazione della sintassi utilizzata per analizzare le stringhe di nomi
La proprietà della sintassi del nome può essere inoltrata al costruttore InitialContext tramite il relativo parametro, nelle proprietà di sistema o in un file jndi.properties . Il contesto iniziale e tutti i contesti cercati da tale contesto iniziale analizzano le stringhe del nome in base alla sintassi specificata.
Il seguente esempio mostra come impostare la sintassi del nome per rendere le stringhe del nome di analisi del contesto iniziale in base alla sintassi INS.
... import java.util.Hashtable; import javax.naming.Context; import javax.naming.InitialContext; import com.ibm.websphere.naming.PROPS; // WebSphere naming constants ... Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory"); env.put(Context.PROVIDER_URL, ...); env.put(PROPS.NAME_SYNTAX, PROPS.NAME_SYNTAX_INS); Context initialContext = new InitialContext(env); // The following name maps to a CORBA name component as follows: // id = "a.name", kind = "in.INS.format" // The unescaped dot is used as the delimiter. // Escaped dots are interpreted literally. java.lang.Object o = initialContext.lookup("a\\.name.in\\.INS\\.format"); ...La sintassi del nome INS richiede che i punti integrati (.) in un nome come
in.INS.formatsiano preceduti da un carattere di escape barra rovesciata (\). In un valore letterale stringa Java, un carattere barra rovesciata (\) deve essere preceduto da un altro carattere barra rovesciata (\\). - Da una riga comandi, immettere il valore stringa effettivo. Ad esempio:
- Facoltativo: Disabilita normalizzazione nome host
I riferimenti a nomi host, indirizzi IP e localhost negli URL del provider sono generalmente normalizzati. Il formato di un nome host normalizzato è la forma completa del nome host. La normalizzazione dei nomi host migliora l'efficienza del sistema in quanto abilita l'utilizzo della stessa cache JNDI per un determinato host di avvio indipendentemente dal formato del riferimento nell'URL del fornitore. Ad esempio, la normalizzazione del nome host abilita la stessa cache JNDI da utilizzare per i riferimenti myhost, myhost.mydomain.come localhost se tutti questi riferimenti fanno riferimento allo stesso host.
Poiché i nomi host normalizzati vengono memorizzati nella cache, le successive normalizzazioni vengono eseguite più rapidamente. In alcuni ambienti di rete, i dati di ricerca dei nomi di dominio vengono modificati dinamicamente, rendendo obsoleti i dati di normalizzazione dei nomi host memorizzati nella cache. In tali ambienti, potrebbe essere necessario disabilitare la normalizzazione del nome host. Quando si disabilita la normalizzazione host, il nome host e gli indirizzi IP vengono utilizzati così come sono. I riferimenti a localhost generalmente si risolvono nell'indirizzo loopback, 127.0.0.1.
I client JNDI possono disabilitare la normalizzazione dei nomi host impostando una proprietà. L'impostazione della propriet ... viene applicata dalla produzione del contesto iniziale quando si crea un'istanza di un nuovo oggetto java.naming.InitialContext .
Utilizzare una delle seguenti tecniche per impostare questa proprietà:- È possibile immettere il valore stringa effettivo da una riga comandi. Ad esempio:
java -Dcom.ibm.websphere.naming.hostname.normalizer=...none... - È possibile creare un file denominato jndi.properties come file di testo con le impostazioni delle proprietà desiderate. Ad esempio:
... com.ibm.websphere.naming.hostname.normalizer=...none... ...Se si utilizza questa tecnica, tenere presente che altre istanze del file jndi.properties potrebbero esistere nel percorso classi e potrebbero contenere impostazioni di proprietà in conflitto. Le impostazioni delle proprietà sono determinate dall'ordine in cui il programma di caricamento classi raccoglie i file jndi.properties . Non è possibile controllare l'ordine utilizzato dal programma di caricamento classi per individuare i file nel percorso classi. WebSphere Application Server non contiene o crea inizialmente alcun file jndi.properties che imposta la proprietà com.ibm.websphere.naming.hostname.normalizer .
- È possibile utilizzare PROPS.HOSTNAME_NORMALIZER* Costanti Java in un programma Java. Queste costanti Java sono definite nel file com.ibm.websphere.naming.PROPS . Di seguito sono riportate le definizioni delle costanti da specificare se si utilizza questa tecnica:
public static final String HOSTNAME_NORMALIZER = "com.ibm.websphere.naming.hostname.normalizer"; public static final String HOSTNAME_NORMALIZER_NONE = "...none...;Per utilizzare queste definizioni in un programma Java, aggiungere l'impostazione della proprietà ad una tabella hash e inoltrarla al costruttore InitialContext :
java.util.Hashtable env = new java.util.Hashtable(); ... env.put(PROPS.HOSTNAME_NORMALIZER, PROPS.HOSTNAME_NORMALIZER_NONE); // Disable hostname normalization ... javax.naming.Context initialContext = new javax.naming.InitialContext(env);
Esempio: disabilitazione della normalizzazione del nome host
È possibile passare la proprietà del normalizer del nome host al costruttore InitialContext tramite il parametro del constructor InitialContext nel file delle proprietà di sistema o in un file jndi.properties . Il contesto iniziale e i contesti futuri cercati da tale contesto iniziale utilizzano questa impostazione di proprietà.
Il seguente esempio mostra come disabilitare la normalizzazione del nome host.
... import java.util.Hashtable; import javax.naming.Context; import javax.naming.InitialContext; import com.ibm.websphere.naming.PROPS; // WebSphere naming constants ... Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory"); env.put(Context.PROVIDER_URL, ...); env.put(PROPS.HOSTNAME_NORMALIZER, PROPS.HOSTNAME_NORMALIZER_NONE); Context initialContext = new InitialContext(env); java.lang.Object o = initialContext.lookup(...); ... - È possibile immettere il valore stringa effettivo da una riga comandi. Ad esempio: