2008-09-06 6 views
25

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

Для развития (LOCALHOST), мы могли бы быть запущен Tomcat и при объявлении в < контексте > секции server.xml, Tomcat будет висеть JNDI источников данных на "Java: комп/ENV/JDBC/*" в дереве JNDI ,

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

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

ответ

9

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

1

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

0

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

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

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

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

 
ds.jndi=wlsds 

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

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

1

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

Это то, что мы имеем для кота:

контекст:

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

весна:

<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/jeehttp://www.springframework.org/schema/jee/spring-jee-2.0.xsd

+0

Почему вы используете библиотеки ActiveMQ для подключения к weblogic? – wmarbut 2016-01-13 22:42:22

2

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

19

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

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

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

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

Понадобится:

  • <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. Это common mistake to instantiate database connection pools in your application.

весной

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

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

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

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

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

2

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

Весной:

<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. В разделе «Цели» УБЕДИТЕСЬ, ЧТО ВЫ ЗАПИСИЛИ ДАТУСУРС К СЕРВЕРУ, КОТОРУЮ ВЫ ОТСУТСТВУЕТЕ ВАШЕ ПРИЛОЖЕНИЕ!. Этот конкретный момент стоил мне некоторого времени ...