Поиск Tomcat vs Weblogic JNDI

Серверы Weblogic, которые мы используем, были настроены так, чтобы разрешать имена источников данных JNDI, такие как "приложения".

Для разработки (localhost) мы можем запускать Tomcat и объявляться в <context> раздел server.xml, Tomcat будет вставлять источники данных JNDI в "java: comp/env/jdbc/*" в дереве JNDI.

Проблема: в Weblogic, поиск JNDI - это "приложения", в то время как в Tomcat кажется, что я должен предоставить формальный "java: comp/env/jdbc/appds". Я боюсь, что версия Tomcat является неявным стандартом, но, к сожалению, я не могу изменить конфигурацию Weblogic... так что это означает, что мы заканчиваем двумя различными конфигурационными файлами spring (мы используем spring 2.5) для облегчения в разных средах.

Есть ли элегантный способ решить эту проблему. Могу ли я посмотреть имена JNDI прямо в Tomcat? Может ли spring взять имя и посмотреть в обоих местах? Поиски или предложения Google будут замечательными.

Ответ 1

JndiLocatorSupport имеет свойство resourceRef. При установке этого значения префикс "java: comp/env/" будет добавляться автоматически. Поэтому я считаю правильным было бы дифференцировать этот параметр при переходе с Tomcat на Weblogic.

Ответ 2

Как использовать одно JNDI-имя в вашем веб-приложении

Я боролся с этим несколько месяцев. Лучшее решение - сделать ваше приложение переносимым, чтобы у вас было то же имя JNDI как в Tomcat, так и в Weblogic.

Чтобы сделать это, вы изменяете свои web.xml и spring-beans.xml, чтобы указать одно имя jndi, и предоставить сопоставление каждому имени jndi конкретного поставщика.

Я разместил каждый файл ниже.

Вам нужно:

  • A <resource-ref /> запись в web.xml для вашего приложения для использования одного имени
  • Файл WEB-INF/weblogic.xml для сопоставления имени jndi с ресурсом, управляемым WebLogic
  • Файл META-INF/context.xml для сопоставления имени jndi с ресурсом, управляемым Tomcat
    • Это может быть либо в установке Tomcat, либо в вашем приложении.

Как правило, предпочитайте иметь свои имена jndi в своем приложении, например jdbc/MyDataSource и jms/ConnFactory, и избегать их префикса java:comp/env/.

Кроме того, источники данных и фабрики соединений лучше всего управляют контейнером и используются с JNDI. Это распространенная ошибка для создания пулов подключений к базе данных в приложении.

spring

<?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/context.xml(для Tomcat)

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

Ответ 3

Я справился с трюком с Tomcat и WebLogic, используя Spring. Здесь приводится описание того, как это сработало для меня.

Ответ 4

В Tomcat и Weblogic для меня работает следующая конфигурация.

В Spring:

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

В консоли администратора Weblogic создайте ресурс JDBC с именем jdbc/AgriShare. В разделе "Цели" УБЕДИТЕСЬ, ЧТО ВЫ ЗАПИСИЛИ ДАТУСУРС К СЕРВЕРУ, ВЫ ОТКЛЮЧАЕТЕ ВАШЕ ПРИЛОЖЕНИЕ!. Этот конкретный момент стоил мне немного времени...

Ответ 5

Как насчет переменной окружения? Установите разработчики машин с именем и продукцией tomcat с именем Weblogic. Вы даже можете настроить свой код на использование по умолчанию (WebLogic), если переменная не существует.

Ответ 6

Как вы ссылаетесь на ресурс в spring?

Это то, что у нас есть для tomcat:

контекст:

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

spring:

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

Пространство имен jee происходит от:

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

Ответ 7

Настройка DataSource в самом приложении не является сумасшедшим:) Я бы сказал, что это даже обязательно, если приложение предназначено для развертывания в сетке. Река, GigaSpaces или тому подобное.

Примечание. Я не говорю, что параметры подключения должны быть жестко запрограммированы внутри WAR, их необходимо предоставить во время развертывания/времени выполнения. Это упрощает управление облачными экземплярами, поскольку есть только место для настройки.

Настройка ресурсов в контейнере имеет смысл только в том случае, если там развернуто несколько приложений, и они могут использовать общий ресурс.

Опять же, в облачном типе развертываний есть только одно приложение на экземпляр контейнера сервлета.

Ответ 8

У моего приложения также была аналогичная проблема, и именно так я ее решил:

1) WEB-INF/classes/application.properties содержит запись:

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

2) На машине WLS у меня есть запись в файле /etc/sysenv:

ds.jndi=wlsds

3) Я настроил spring для поиска JNDI в отношении свойства ${ds.jndi}, используя PropertyPlaceholderConfigurer bean с classpath:application.properties и file:/etc/sysenv в качестве местоположений. Я также установил ignoreResourceNotFound в true, чтобы разработчикам не нужно иметь /etc/sysenv на своих машинах.

4) Я запускаю интеграционный тест с использованием Cargo + Jetty, и я не мог правильно настроить там среду JNDI. Таким образом, у меня есть резервный BasicDataSource, также настроенный с помощью свойства defaultObject JndiObjectFactoryBean.