2008-11-06 23 views
14

Hiện tại, chúng tôi có một ứng dụng web tải ngữ cảnh ứng dụng Spring để khởi tạo một chồng đối tượng nghiệp vụ, đối tượng DAO và Hibernate. Chúng tôi muốn chia sẻ ngăn xếp này với một ứng dụng web khác, để tránh có nhiều phiên bản của cùng một đối tượng.Cách tốt nhất để chia sẻ các cá thể đối tượng nghiệp vụ giữa các ứng dụng web Java bằng JBoss và Spring là gì?

Chúng tôi đã xem xét một số cách tiếp cận; phơi bày các đối tượng bằng JMX hoặc JNDI hoặc sử dụng EJB3.

Các phương pháp khác nhau đều có vấn đề của chúng và chúng tôi đang tìm kiếm một phương pháp nhẹ.

Bất kỳ đề xuất nào về cách giải quyết vấn đề này?

Chỉnh sửa: Tôi đã nhận được ý kiến ​​yêu cầu tôi để xây dựng một chút, vì vậy ở đây đi:

Vấn đề chính chúng ta muốn giải quyết là chúng ta muốn chỉ có một thể hiện của Hibernate. Điều này là do các vấn đề với việc vô hiệu hóa bộ nhớ cache cấp 2 của Hibernate khi chạy một số ứng dụng khách làm việc với cùng một nguồn dữ liệu. Ngoài ra, các doanh nghiệp/DAO/Hibernate stack đang phát triển khá lớn, do đó, không nhân đôi nó chỉ có ý nghĩa hơn.

Trước tiên, chúng tôi đã cố gắng xem xét cách mà lớp doanh nghiệp có thể được tiếp xúc với các ứng dụng web khác và Spring cung cấp gói JMX với mức giá của một lượng nhỏ XML. Tuy nhiên, chúng tôi không thể liên kết các thực thể JMX với cây JNDI, vì vậy chúng tôi không thể tìm kiếm các đối tượng từ các ứng dụng web.

Sau đó, chúng tôi đã thử ràng buộc lớp kinh doanh trực tiếp với JNDI. Mặc dù Spring đã không đưa ra bất kỳ phương pháp nào cho việc này, nhưng việc sử dụng JNDITemplate để ràng buộc chúng cũng không đáng kể. Nhưng điều này dẫn đến một số vấn đề mới: 1) Trình quản lý bảo mật từ chối truy cập vào trình nạp lớp RMI, vì vậy máy khách không thành công khi chúng tôi cố gắng gọi các phương thức trên tài nguyên JNDI. 2) Một khi các vấn đề an ninh đã được giải quyết, JBoss đã ném IllegalArgumentException: đối tượng không phải là một thể hiện khai báo lớp. Một chút đọc cho thấy rằng chúng ta cần triển khai sơ khai cho các tài nguyên JNDI, nhưng điều này có vẻ như rất nhiều rắc rối (có lẽ mùa xuân có thể giúp chúng ta?)

Chúng ta chưa nhìn quá nhiều vào EJB, nhưng sau lần đầu tiên hai lần thử tôi tự hỏi liệu những gì chúng tôi đang cố gắng đạt được là hoàn toàn có thể.

Để tóm tắt những gì chúng tôi đang cố gắng đạt được: Một ví dụ JBoss, một số ứng dụng web sử dụng một chồng đối tượng kinh doanh trên lớp DAO và Hibernate.

Trân trọng,

Nils

+0

Bạn có thể nhận xét về 1. Bạn đang cố giải quyết vấn đề gì; 2. Các vấn đề bạn tìm thấy với các phương pháp tương ứng mà bạn đề cập đến. Điều này sẽ cho phép một câu trả lời tập trung hơn ... – johnstok

+0

Thật khó để nói tất cả trong 300 ký tự, vì vậy tôi đã chỉnh sửa câu hỏi để thêm chi tiết :-) –

Trả lời

5

Các ứng dụng web có được triển khai trên cùng một máy chủ không?

Tôi không thể nói cho mùa xuân, nhưng nó là đơn giản để di chuyển logic kinh doanh của bạn vào tầng EJB sử dụng Session Beans.

Tổ chức ứng dụng thẳng về phía trước. Logic đi vào Session Beans, và các Session Beans được gói trong một jar đơn như một tạo phẩm Java EE với một tệp ejb-jar.xml (trong EJB3, điều này có thể sẽ thực sự trống).

Sau đó, nhóm các lớp Thực thể vào một tệp jar riêng biệt.

Tiếp theo, bạn sẽ xây dựng từng ứng dụng web vào tệp WAR của riêng chúng.

Cuối cùng, tất cả các lọ và chiến tranh được gộp vào một EAR Java EE, với tệp application.xml liên quan (một lần nữa, điều này có thể sẽ rất nhỏ, chỉ cần liệt kê các lọ trong EAR).

EAR này được triển khai bán buôn cho máy chủ ứng dụng.

Mỗi WAR độc lập một cách hiệu quả - các phiên riêng của chúng, có đường dẫn ngữ cảnh riêng, v.v. Nhưng chúng chia sẻ kết thúc EJB chung, vì vậy bạn chỉ có một bộ nhớ cache cấp 2.

Bạn cũng sử dụng tham chiếu cục bộ và ngữ nghĩa gọi để nói chuyện với EJB vì chúng ở cùng một máy chủ. Không cần cho các cuộc gọi từ xa ở đây.

Tôi nghĩ rằng điều này giải quyết khá tốt vấn đề bạn đang gặp phải, và nó khá đơn giản trong Java EE 5 với EJB 3.

Ngoài ra, bạn vẫn có thể sử dụng Spring cho nhiều công việc của bạn, như tôi hiểu nhưng tôi không phải là người mùa xuân nên tôi không thể nói chi tiết.

+0

Có, mọi thứ được triển khai cho cùng một máy chủ. Điều này có vẻ khá thú vị, tôi sẽ cung cấp cho EJB một shot ngày hôm nay. Điểm của tôi về mùa xuân là nó cung cấp để bọc đậu cho ví dụ JMX không có mã nào, nhưng rõ ràng không dành cho EJB. Dù sao, tôi nhìn vào cách tiếp cận EJB ngày hôm nay. –

-1

Hãy xem JBossCache. Nó cho phép bạn dễ dàng chia sẻ/sao chép bản đồ dữ liệu giữa các trường hợp JVM mulitple (cùng một hộp hoặc khác nhau). Nó rất dễ sử dụng và có nhiều tùy chọn giao thức mức dây (TCP, UDP Multicast, v.v.).

3

Terracotta có thể phù hợp ở đây (tiết lộ: Tôi là nhà phát triển cho Đất nung). Terracotta minh bạch cụm các đối tượng Java ở cấp JVM và tích hợp với cả Spring và Hibernate. Nó là mã nguồn mở và miễn phí.

Như bạn đã nói, sự cố của nhiều ứng dụng web của khách hàng sử dụng bộ nhớ cache L2 đang giữ những bộ nhớ cache đó đồng bộ. Với Terracotta bạn có thể nhóm một bộ đệm L2 Hibernate đơn. Mỗi nút máy khách làm việc với bản sao của bộ nhớ cache được nhóm đó và Terracotta giữ nó trong đồng bộ. This link giải thích thêm.

Đối với đối tượng kinh doanh của mình, bạn có thể sử dụng số Spring integration của Terracotta để nhóm hạt của bạn - mỗi ứng dụng web có thể chia sẻ các thể hiện bean được nhóm và Terracotta giữ trạng thái nhóm trong đồng bộ một cách minh bạch.

0

Tôi không thực sự chắc chắn những gì bạn đang cố gắng giải quyết; vào cuối ngày, mỗi jvm sẽ hoặc là có bản sao các cá thể của các đối tượng, hoặc các nhánh đại diện cho các đối tượng tồn tại trên một máy chủ (logic) khác.

Bạn có thể thiết lập máy chủ 'logic nghiệp vụ' thứ ba có api từ xa mà hai ứng dụng web của bạn có thể gọi. Giải pháp điển hình là sử dụng EJB, nhưng tôi nghĩ rằng mùa xuân có các tùy chọn từ xa được tích hợp trong ngăn xếp của nó.

Tùy chọn khác là sử dụng một số hình thức kiến ​​trúc bộ nhớ cache được chia sẻ ... sẽ đồng bộ hóa các thay đổi đối tượng giữa các máy chủ, nhưng bạn vẫn có hai bộ thể hiện.

+0

Không phải vậy nếu bạn sử dụng Terracotta –

2

Thực ra, nếu bạn muốn có giải pháp gọn nhẹ và không cần giao dịch hoặc phân cụm chỉ cần sử dụng hỗ trợ Spring cho RMI. Nó cho phép để lộ hạt đậu mùa xuân từ xa bằng cách sử dụng chú thích đơn giản trong các phiên bản mới nhất. Xem http://static.springframework.org/spring/docs/2.0.x/reference/remoting.html.

+0

Tôi đã sử dụng phương pháp này để truy cập các hạt Spring được chia sẻ từ một webapp. Nó hoạt động mặc dù tôi vẫn cảm thấy có lẽ là một giải pháp tốt hơn/sạch hơn. – Mark

+0

Nếu bạn không thích RMI, Spring cung cấp một vài tùy chọn remoting khác - Hessian, Burlap và HttpInvoker (giải pháp remoting tùy chỉnh của Spring - tuần tự hóa Java qua HTTP). Tất nhiên luôn có các dịch vụ web. –

1

Cảm ơn bạn đã trả lời cho đến thời điểm này. Chúng tôi vẫn chưa hoàn toàn ở đó, nhưng chúng tôi đã thử một vài điều bây giờ và xem mọi thứ rõ ràng hơn. Đây là bản cập nhật ngắn:

Giải pháp có vẻ khả thi nhất là EJB. Tuy nhiên, điều này sẽ yêu cầu một số thay đổi trong mã của chúng tôi, vì vậy chúng tôi sẽ không triển khai đầy đủ giải pháp đó ngay bây giờ. Tôi gần như ngạc nhiên rằng chúng tôi đã không thể tìm thấy một số tính năng mùa xuân để giúp chúng tôi ở đây.

Chúng tôi cũng đã thử tuyến đường JNDI, kết thúc bằng sự cần thiết cho các nhánh cho tất cả các giao diện được chia sẻ. Điều này cảm thấy như rất nhiều rắc rối, xem xét rằng tất cả mọi thứ là trên cùng một máy chủ anyway.

Hôm qua, chúng tôi đã có một bước đột phá nhỏ với JMX. Mặc dù JMX chắc chắn không có ý nghĩa đối với loại hình sử dụng này, chúng tôi đã chứng minh rằng nó có thể được thực hiện - không có thay đổi mã và một lượng XML tối thiểu (một Cảm ơn bạn lớn đến Mùa xuân cho MBeanExporter và MBeanProxyFactoryBean). Những hạn chế lớn đối với phương thức này là hiệu suất và thực tế là các lớp miền của chúng ta phải được chia sẻ thông qua thư mục máy chủ/lib JBoss '. Tức là, chúng ta phải loại bỏ một số phụ thuộc từ các WAR của chúng ta và di chuyển chúng đến máy chủ/lib, nếu không chúng ta sẽ nhận ClassCastException khi lớp nghiệp vụ trả về các đối tượng từ mô hình miền riêng của chúng ta. Tôi hoàn toàn hiểu tại sao điều này xảy ra, nhưng nó không phải là lý tưởng cho những gì chúng tôi đang cố gắng đạt được.

Tôi nghĩ đã đến lúc phải cập nhật một chút, vì dường như giải pháp tốt nhất sẽ mất một thời gian để triển khai. Tôi sẽ đăng các phát hiện của chúng tôi ở đây khi chúng tôi đã thực hiện công việc đó.

+0

Đã được đề xuất nhiều lần về chủ đề này bởi chính tôi và những người khác, nhưng bạn đã xem Terracotta chưa? Không giống như tất cả các giải pháp khác được trình bày cho đến nay, nó được thiết kế rõ ràng để chia sẻ trạng thái là những gì bạn yêu cầu. –

2

Bạn nên xem qua Ứng dụng web tham khảo Terracotta - Trình kiểm tra. Nó có hầu hết các thành phần bạn đang tìm kiếm - nó có Hibernate, JPA và Spring với một backend MySQL.

Nó được điều chỉnh trước để mở rộng tới 16 nút, 20 nghìn người dùng đồng thời.

Kiểm tra nó ra ở đây: http://reference.terracotta.org/examinator

1

mùa xuân không có một điểm hội nhập mà có thể quan tâm đến bạn: EJB 3 injection nterceptor. Điều này cho phép bạn truy cập các bean mùa xuân từ các EJB.

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