Подтвердить что ты не робот

Поиск 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 будут замечательными.

4b9b3361

Ответ 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.