Domanda

I server Weblogic che stiamo utilizzando sono stati configurati per consentire nomi di origini dati JNDI come "appds".

Per lo sviluppo (localhost), potremmo eseguire Tomcat e quando dichiarato nella sezione <context> di server.xml, Tomcat bloccherà le origini dati JNDI su "java:comp/env/jdbc/*" nell'albero JNDI.

Problema: in Weblogic, la ricerca JNDI è "appds" mentre in Tomcat, sembra che debba fornire il formale "java:comp/env/jdbc/appds".Temo che la versione Tomcat sia uno standard implicito ma sfortunatamente non posso modificare la configurazione di Weblogic...ciò significa che ci ritroveremo con due diversi file di configurazione di Spring (stiamo usando Spring 2.5) per facilitare i diversi ambienti.

Esiste un modo elegante per risolvere questo problema.Posso cercare i nomi JNDI direttamente in Tomcat?Può la primavera prendere un nome e guardare in entrambi i posti?Le ricerche o i suggerimenti di Google sarebbero fantastici.

È stato utile?

Soluzione

JndiLocatorSupport ha una proprietà resourceRef.Quando si imposta questo valore su true, il prefisso "java:comp/env/" verrà anteposto automaticamente.Quindi credo che sarebbe corretto differenziare questo parametro nel passaggio da Tomcat a Weblogic.

Altri suggerimenti

Come utilizzare un singolo nome JNDI nella tua app Web

Anch'io ho lottato con questo per alcuni mesi.La soluzione migliore è rendere portabile la tua applicazione in modo da avere lo stesso nome JNDI sia in Tomcat che in Weblogic.

Per fare ciò, cambi il tuo web.xml E spring-beans.xml per puntare a un singolo nome jndi e fornire una mappatura al nome jndi specifico di ciascun fornitore.

Ho inserito ogni file qui sotto.

Hai bisogno:

  • UN <resource-ref /> voce in web.xml affinché la tua app utilizzi un singolo nome
  • Un file WEB-INF/weblogic.xml per associare il nome jndi alla risorsa gestita da WebLogic
  • Un file META-INF/context.xml per mappare il tuo nome jndi alla risorsa gestita da Tomcat
    • Può essere nell'installazione di Tomcat o nella tua app.

Come regola generale, preferisci avere i tuoi nomi jndi nella tua app come jdbc/MyDataSource E jms/ConnFactory ed evitare di prefissarli con java:comp/env/.

Inoltre, le origini dati e le factory di connessione vengono gestite al meglio dal contenitore e utilizzate con JNDI.È un errore comune nel creare un'istanza dei pool di connessioni al database nell'applicazione.

primavera

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">

<jee:jndi-lookup jndi-name="jdbc/appds"
                 id="dataSource" />
</beans>

web.xml

<resource-ref>
    <description>My data source</description>
    <res-ref-name>jdbc/appds</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

weblogic.xml

<?xml version="1.0" encoding="UTF-8" ?>
<weblogic-web-app
    xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://xmlns.oracle.com/weblogic/weblogic-web-app http://http://www.oracle.com/technology/weblogic/weblogic-web-app/1.1/weblogic-web-app.xsd">

<resource-description>
    <jndi-name>appds</jndi-name>
    <res-ref-name>jdbc/appds</res-ref-name>
</resource-description>
</weblogic-web-app>

META-INF/contesto.xml (per Tomcat)

<Context>
    <ResourceLink global="jdbc/appds" name="jdbc/appds" type="javax.sql.DataSource"/>
</Context>

Ho gestito il trucco con Tomcat e WebLogic utilizzando Spring. Qui è una descrizione di come ha funzionato per me.

La seguente configurazione funziona in Tomcat e Weblogic per me.

In primavera:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
   <!-- This will prepend 'java:comp/env/' for Tomcat, but still fall back to the short name for Weblogic -->
   <property name="resourceRef" value="true" /> 
   <property name="jndiName" value="jdbc/AgriShare" />
</bean>

Nella console di amministrazione Weblogic creare una risorsa JDBC denominata jdbc/AgriShare.In "Obiettivi", ASSICURATI DI INDIRIZZARE L'ORIGINE DATI AL SERVER SU CUI STAI IMPLEMENTANDO LA TUA APP!.Questo particolare punto mi è costato un po' di tempo proprio ora...

Che ne dici di una variabile ambientale?Imposta le macchine degli sviluppatori con il nome Tomcat e la produzione con il nome Weblogic.Puoi anche impostare il tuo codice in modo che ne utilizzi uno predefinito (WebLogic) nel caso in cui la variabile non esista.

Come fai riferimento alla risorsa in primavera?

Questo è ciò che abbiamo per Tomcat:

contesto:

<Resource name="jms/ConnectionFactory" auth="Container" type="org.apache.activemq.ActiveMQConnectionFactory" description="
JMS Connection Factory"
        factory="org.apache.activemq.jndi.JNDIReferenceFactory" brokerURL="tcp://localhost:61615" brokerName="StandaloneAc
tiveMQBroker"/>

primavera:

    <beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

<jee:jndi-lookup jndi-name="jms/ConnectionFactory" id="connectionFactory" resource-ref="true"
                         expected-type="javax.jms.ConnectionFactory" lookup-on-startup="false"/>

Lo spazio dei nomi jee deriva da:

http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd

Configurare DataSource nell'applicazione in sé non è così folle :) Direi che è addirittura obbligatorio se l'applicazione deve essere distribuita su una griglia.River, GigaSpaces o simili.

Nota:Non dico che le impostazioni di connessione debbano essere codificate all'interno di WAR, devono essere fornite al momento della distribuzione/runtime.Ciò semplifica la gestione delle istanze cloud poiché c'è solo un posto da configurare.

La configurazione delle risorse nel contenitore ha senso solo se lì vengono distribuite più applicazioni e possono utilizzare risorse condivise.

Ancora una volta, nelle distribuzioni di tipo cloud è presente una sola applicazione per istanza del contenitore servlet.

Anche la mia applicazione presentava un problema simile ed è così che l'ho risolto:

1) WEB-INF/classes/application.properties contiene la voce:

ds.jndi=java:comp/env/jdbc/tcds

2) Sulla macchina WLS, ho una voce nel file /etc/sysenv file:

ds.jndi=wlsds

3) Ho configurato Spring per cercare JNDI rispetto alla proprietà ${ds.jndi}, usare un PropertyPlaceholderConfigurer fagiolo con classpath:application.properties E file:/etc/sysenv come luoghi.Ho impostato anche il ignoreResourceNotFound A true in modo che gli sviluppatori non debbano averlo /etc/sysenv sulle loro macchine.

4) Ho eseguito un test di integrazione utilizzando Cargo+Jetty e non sono riuscito a configurare correttamente un ambiente JNDI lì.Quindi ho un ripiego BasicDataSource configurato anche utilizzando il file defaultObject proprietà di JndiObjectFactoryBean.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top