2008-09-06 32 views
25

Các máy chủ Weblogic chúng tôi đang sử dụng đã được định cấu hình để cho phép các tên nguồn dữ liệu JNDI như "appds".Tomcat vs Weblogic JNDI Lookup

Đối với phát triển (localhost), chúng tôi có thể chạy Tomcat và khi khai báo trong bối cảnh < > phần của server.xml, Tomcat sẽ treo datasources JNDI trên "java: comp/env/jdbc/*" trong cây JNDI .

Vấn đề: trong WebLogic, tra cứu JNDI là "appds" trong khi ở Tomcat, có vẻ như tôi phải cung cấp "java: comp/env/jdbc/appds" chính thức. Tôi sợ phiên bản Tomcat là một tiêu chuẩn ngầm nhưng không may, tôi không thể thay đổi cấu hình của Weblogic ... do đó có nghĩa là chúng tôi kết thúc với hai tệp cấu hình mùa xuân khác nhau (chúng tôi đang sử dụng spring 2.5) để tạo điều kiện thuận lợi cho các môi trường khác nhau.

Có cách nào thanh lịch để giải quyết vấn đề này không. Tôi có thể tìm tên JNDI trực tiếp trong Tomcat không? Spring có thể lấy tên và nhìn vào cả hai nơi không? Các tìm kiếm hoặc đề xuất của Google sẽ tuyệt vời.

Trả lời

9

JndiLocatorSupport có thuộc tính resourceRef. Khi đặt giá trị này đúng, tiền tố "java: comp/env /" sẽ được tự động thêm vào trước. Vì vậy, tôi tin rằng nó sẽ là chính xác để phân biệt tham số này khi chuyển từ Tomcat sang Weblogic.

1

Làm thế nào về một biến evironment? Thiết lập các máy phát triển với tên tomcat và sản xuất với tên Weblogic. Bạn thậm chí có thể thiết lập mã của bạn để sử dụng một mặc định (WebLogic) trong trường hợp biến không tồn tại.

0

ứng dụng của tôi cũng đã có một vấn đề tương tự và đây là cách tôi giải quyết nó:

1) WEB-INF/classes/application.properties chứa mục:

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

2) Trên máy WLS, tôi có một mục trong /etc/sysenv file:

 
ds.jndi=wlsds 

3) tôi cấu hình mùa xuân để tra cứu JNDI vis tài sản ${ds.jndi}, sử dụng một PropertyPlaceholderConfigurer được an với classpath:application.propertiesfile:/etc/sysenv làm vị trí. Tôi cũng đặt ignoreResourceNotFound thành true để nhà phát triển không cần phải có /etc/sysenv trên máy của họ.

4) Tôi chạy thử nghiệm tích hợp bằng cách sử dụng Cargo + Jetty và tôi có thể không thiết lập đúng môi trường JNDI ở đó. Vì vậy, tôi có một dự phòng BasicDataSource được định cấu hình quá sử dụng thuộc tính defaultObject của JndiObjectFactoryBean.

1

Bạn tham chiếu tài nguyên vào mùa xuân như thế nào?

Đây là những gì chúng tôi đã cho tomcat:

bối cảnh:

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

mùa xuân:

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

Các namespace jee đến từ:

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

+0

Tại sao bạn sử dụng thư viện ActiveMQ để kết nối với weblogic? – wmarbut

2

Tôi đã quản lý thủ thuật với Tomcat và WebLogic bằng Spring. Here là mô tả về cách nó hoạt động đối với tôi.

19

Làm thế nào để sử dụng một tên JNDI duy nhất trong ứng dụng web của bạn

Tôi đã vật lộn với điều này trong một vài tháng bản thân mình. Giải pháp tốt nhất là làm cho ứng dụng của bạn di động để bạn có cùng tên JNDI trong cả Tomcat và Weblogic.

Để làm điều đó, bạn thay đổi web.xmlspring-beans.xml để trỏ đến một tên jndi duy nhất và cung cấp ánh xạ tới từng tên jndi của nhà cung cấp cụ thể.

Tôi đã đặt từng tệp bên dưới.

Bạn cần:

  • Một entry <resource-ref /> trong web.xml cho ứng dụng của bạn sử dụng một cái tên duy nhất
  • Một tập tin WEB-INF/weblogic.xml để ánh xạ tên jndi của bạn đến tài nguyên của WebLogic
  • Một tập tin quản lý META-INF/context.xml để ánh xạ tên jndi của bạn với tài nguyên được quản lý bởi Tomcat
    • Điều này có thể nằm trong cài đặt Tomcat hoặc trong ứng dụng của bạn.

Theo nguyên tắc chung, thích có tên jndi bạn trong ứng dụng của bạn như jdbc/MyDataSourcejms/ConnFactory và tránh tiền tố họ với java:comp/env/.

Ngoài ra, nguồn dữ liệu và nhà máy kết nối được quản lý tốt nhất bởi vùng chứa và được sử dụng với JNDI. Đó là common mistake to instantiate database connection pools in your application.

mùa xuân

<?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/ngữ cảnh.xml (đối với Tomcat)

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

Thiết lập DataSource trong bản thân ứng dụng mà không phải là điên :) Tôi sẽ nói rằng thậm chí còn bắt buộc nếu ứng dụng có nghĩa là để được triển khai trên một mạng lưới. Sông, GigaSpaces hoặc tương tự.

Lưu ý: Tôi không nói cài đặt kết nối phải được mã hóa cứng bên trong WAR, chúng cần được cung cấp tại thời gian/thời gian triển khai. Điều này đơn giản hóa việc quản lý các trường hợp đám mây vì chỉ có nơi để cấu hình.

Định cấu hình tài nguyên tại vùng chứa chỉ có ý nghĩa khi nhiều ứng dụng được triển khai ở đó và chúng có thể sử dụng tài nguyên được chia sẻ.

Một lần nữa, trong loại triển khai trên đám mây, chỉ có một ứng dụng cho mỗi cá thể thùng chứa servlet.

2

Cấu hình sau hoạt động trong Tomcat và Weblogic cho tôi.

Trong mùa xuân:

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

Trong WebLogic Admin Console tạo một nguồn tài nguyên JDBC tên jdbc/AgriShare. Dưới 'Mục tiêu', BẢO ĐẢM BẠN MỤC TIÊU TÀI LIỆU CHO MÁY CHỦ BẠN ĐANG VIỆC SỬ DỤNG ỨNG DỤNG CỦA BẠN!. Điểm đặc biệt này khiến tôi mất thêm thời gian ...

Các vấn đề liên quan