سؤال

تم تكوين خوادم Weblogic التي نستخدمها للسماح بأسماء مصادر بيانات JNDI مثل "appds".

للتطوير (المضيف المحلي)، قد نقوم بتشغيل Tomcat وعندما يتم الإعلان عنه في قسم <context> من server.xml، سيقوم Tomcat بتعليق مصادر بيانات JNDI على "java:comp/env/jdbc/*" في شجرة JNDI.

مشكلة: في Weblogic، بحث JNDI هو "appds" بينما في Tomcat، يبدو أنه يجب علي تقديم "java:comp/env/jdbc/appds" الرسمي.أخشى أن إصدار Tomcat هو معيار ضمني ولكن لسوء الحظ، لا يمكنني تغيير تكوين Weblogic ...وهذا يعني أنه سينتهي بنا الأمر بملفين مختلفين للتكوين الربيعي (نحن نستخدم الربيع 2.5) لتسهيل البيئات المختلفة.

هل هناك طريقة أنيقة لمعالجة هذا.هل يمكنني البحث عن أسماء JNDI مباشرةً في Tomcat؟هل يستطيع الربيع أن يأخذ اسمًا ويبحث في كلا المكانين؟ستكون عمليات البحث أو الاقتراحات على Google رائعة.

هل كانت مفيدة؟

المحلول

JndiLocatorSupport لديه خاصية resourceRef.عند تعيين هذا على "صحيح"، سيتم إضافة البادئة "java:comp/env/" تلقائيًا.لذلك أعتقد أنه سيكون من الصحيح التمييز بين هذه المعلمة عند الانتقال من Tomcat إلى Weblogic.

نصائح أخرى

كيفية استخدام اسم 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.انه خطأ شائع لإنشاء مجموعات اتصال قاعدة البيانات في التطبيق الخاص بك.

ربيع

<?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 (للقطط)

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

لقد تمكنت من إدارة الحيلة باستخدام Tomcat وWebLogic باستخدام Spring. هنا هو وصف لكيفية نجاحه بالنسبة لي.

يعمل التكوين التالي في 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.ضمن "الأهداف"، تأكد من توجيه مصدر البيانات إلى الخادم الذي تنشر تطبيقك عليه!.هذه النقطة بالتحديد كلفتني بعض الوقت الآن..

ماذا عن متغير البيئة؟قم بتعيين أجهزة المطورين باسم Tomcat والإنتاج باسم Weblogic.يمكنك أيضًا تعيين التعليمات البرمجية الخاصة بك لاستخدام رمز افتراضي (WebLogic) في حالة عدم وجود المتغير.

كيف يمكنك الرجوع إلى المورد في الربيع؟

هذا ما لدينا للقطط:

سياق:

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

إعداد DataSource في التطبيق نفسه ليس أمرًا جنونيًا :) أود أن أقول إن هذا أمر إلزامي حتى إذا كان من المفترض نشر التطبيق على الشبكة.River أو GigaSpaces أو ما شابه ذلك.

ملحوظة:لا أقول أن إعدادات الاتصال يجب أن تكون مشفرة داخل WAR، بل يجب توفيرها في وقت النشر/وقت التشغيل.يعمل هذا على تبسيط إدارة المثيلات السحابية نظرًا لوجود مكان واحد فقط للتكوين.

لا يكون تكوين الموارد في الحاوية منطقيًا إلا إذا تم نشر تطبيقات متعددة هناك ويمكنها استخدام الموارد المشتركة.

مرة أخرى، في عمليات النشر السحابية، يوجد تطبيق واحد فقط لكل مثيل حاوية servlet.

واجه طلبي أيضًا مشكلة مماثلة وهذه هي الطريقة التي قمت بحلها:

1) WEB-INF/classes/application.properties يحتوي على الإدخال:

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

2) على جهاز WLS، لدي إدخال في ملف /etc/sysenv ملف:

ds.jndi=wlsds

3) لقد قمت بتكوين الربيع للبحث عن JNDI في الخاصية ${ds.jndi}, ، باستخدام أ PropertyPlaceholderConfigurer الفول مع classpath:application.properties و file:/etc/sysenv كمواقع.لقد قمت أيضًا بتعيين ignoreResourceNotFound ل true بحيث لا يحتاج المطورون إلى ذلك /etc/sysenv على أجهزتهم.

4) أجريت اختبار تكامل باستخدام Cargo+Jetty ولم أتمكن من إعداد بيئة JNDI بشكل صحيح هناك.لذلك لدي احتياطي BasicDataSource تم تكوينه أيضًا باستخدام defaultObject ممتلكات JndiObjectFactoryBean.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top