2008-09-06 9 views
25

Die Weblogic-Server, die wir verwenden, wurden so konfiguriert, dass sie JNDI-Datenquellennamen wie "appds" zulassen.Tomcat vs Weblogic JNDI Lookup

Für Entwicklung (localhost), könnten wir Tomcat laufen und wenn im <Kontext> Abschnitt server.xml erklärt, Tomcat JNDI Datenquellen auf hängen "java: comp/env/jdbc/*" in der JNDI-Struktur .

Problem: in Weblogic, die JNDI-Lookup "appds", während in Tomcat, so scheint es, dass ich muss die formale bieten "java: comp/env/jdbc/appds". Ich fürchte, die Tomcat-Version ist ein impliziter Standard, aber leider kann ich die Konfiguration von Weblogic nicht ändern. Das bedeutet, dass wir am Ende zwei verschiedene Spring-Konfigurationsdateien haben (wir benutzen Spring 2.5), um die verschiedenen Umgebungen zu vereinfachen.

Gibt es eine elegante Möglichkeit, dies anzugehen. Kann ich JNDI-Namen direkt in Tomcat sehen? Kann der Frühling einen Namen bekommen und an beiden Orten nachsehen? Google-Suchen oder Vorschläge wären großartig.

Antwort

9

JndiLocatorSupport hat eine Eigenschaft resourceRef. Wenn Sie dies auf "true" setzen, wird das Präfix "java: comp/env /" automatisch vorangestellt. Also ich glaube, es wäre richtig, diesen Parameter zu unterscheiden, wenn Sie von Tomcat zu Weblogic wechseln.

1

Wie wäre es mit einer Umgebungsvariablen? Setzen Sie Entwicklermaschinen mit dem Tomcat-Namen und der Produktion mit dem Weblogic-Namen. Sie können Ihren Code sogar so einstellen, dass er einen Standardwert verwendet (WebLogic), falls die Variable nicht existiert.

0

Meine Anwendung hatte auch ein ähnliches Problem, und das ist, wie ich es gelöst:

1) WEB-INF/classes/application.properties enthält den Eintrag:

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

2) Auf der WLS-Maschine, habe ich einen Eintrag in der /etc/sysenv Datei:

 
ds.jndi=wlsds 

3) konfiguriert I Feder ${ds.jndi} den JNDI über der Eigenschaft zum nachschlagen unter Verwendung eines PropertyPlaceholderConfigurer sein ein mit classpath:application.properties und file:/etc/sysenv als Standorte. Ich setze auch ignoreResourceNotFound auf true, damit Entwickler /etc/sysenv auf ihren Maschinen nicht haben müssen.

4) Ich habe einen Integrationstest mit Cargo + Jetty durchgeführt und konnte dort keine JNDI-Umgebung einrichten. So habe ich einen Fallback BasicDataSource konfiguriert auch mit der defaultObject Eigenschaft von JndiObjectFactoryBean.

1

Wie verweisen Sie auf die Ressource im Frühjahr?

Dies ist, was wir für Kater haben:

Kontext:

<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"/> 

Frühling:

<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"/> 

Der jee Namespace stammt aus:

+0

Warum verwenden Sie ActiveMQ-Bibliotheken für die Verbindung zu Weblogic? – wmarbut

2

Ich habe den Trick geschaffen, mit Tomcat und WebLogic Frühling verwenden. Here ist eine Beschreibung, wie es bei mir funktioniert hat.

19

Wie ein einzelnen JNDI Namen in Ihrem Web-App verwenden

Ich habe mich mit diesem für ein paar Monate zu kämpfen. Die beste Lösung besteht darin, Ihre Anwendung portierbar zu machen, sodass Sie sowohl in Tomcat als auch in Weblogic den gleichen JNDI-Namen haben.

Um dies zu tun, ändern Sie Ihre web.xml und spring-beans.xml, um auf einen einzelnen JNDI-Namen zu zeigen, und bieten eine Zuordnung zu jedem Hersteller JDNI-Namen.

Ich habe jede Datei unten platziert.

Sie benötigen:

  • A <resource-ref /> Eintrag in web.xml für Ihre Anwendung einen einzigen Namen auf die Ressource von WebLogic
  • Eine Datei verwaltet Karte WEB-INF/weblogic.xml zu benutzen, um Ihre jndi Name
  • Eine Datei META-INF/context.xml, um Ihren jndi-Namen der Ressource zuzuordnen, die von Tomcat verwaltet wird
    • Dies kann entweder in der Tomcat-Installation oder in Ihrer App sein.

Als allgemeine Regel gilt, bevorzugen Ihre jndi Namen in Ihrer App wie jdbc/MyDataSource und jms/ConnFactory und verhindern, dass sie mit java:comp/env/ prefixing haben.

Auch Datenquellen und Verbindungs ​​Fabriken werden am besten durch den Behälter geleitet und mit JNDI verwendet. Es ist ein common mistake to instantiate database connection pools in your application.

Feder

<?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/Kontext.xml (für Tomcat)

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

Einrichten Datasource in der Anwendung ist selbst das nicht verrückt :) Ich würde sagen, dass sogar zwingend notwendig ist, wenn die Anwendung auf einem Gitter eingesetzt werden soll. Fluss, GigaSpaces oder ähnliches.

Hinweis: Ich sage nicht, dass die Verbindungseinstellungen innerhalb von WAR fest codiert sein müssen. Sie müssen zur Implementierungszeit/Laufzeit bereitgestellt werden. Dies vereinfacht das Management von Cloud-Instanzen, da nur Konfigurationsmöglichkeiten zur Verfügung stehen.

Das Konfigurieren von Ressourcen am Container ist nur sinnvoll, wenn mehrere Anwendungen dort bereitgestellt werden und sie gemeinsam genutzte Ressourcen verwenden können.

In Cloud-Bereitstellungsarten gibt es nur eine Anwendung pro Servlet-Container-Instanz.

2

Die folgende Konfiguration funktioniert in Tomcat und Weblogic für mich.

Im Frühjahr:

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

In Weblogic Admin-Konsole eine JDBC-Ressource jdbc/AgriShare Namen erstellen. Unter "Targets", MACHEN SIE SICHER, DASS SIE DAS DATASOURCE AN DEN SERVER ZIELEN, MIT DEM SIE IHRE APP VERWENDEN!. Dieser spezielle Punkt kostete mich gerade einige Zeit ...

Verwandte Themen