Поиск 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
.