Một ngày trước, đơn của tôi là một EAR, chứa một WAR, một EJB JAR và một vài tệp JAR tiện ích. Tôi đã có một lớp POJO singleton thuộc một trong các tập tin tiện ích, nó làm việc, và tất cả là tốt với thế giới:Làm cách nào để viết một Java EE/EJB Singleton?
EAR
|--- WAR
|--- EJB JAR
|--- Util 1 JAR
|--- Util 2 JAR
|--- etc.
Sau đó, tôi đã tạo ra một WAR thứ hai và phát hiện ra (cách cứng) mà mỗi WAR có của nó ClassLoader riêng, vì vậy mỗi WAR thấy một singleton khác nhau, và mọi thứ bị phá vỡ từ đó. Đây không phải là quá tốt.
EAR
|--- WAR 1
|--- WAR 2
|--- EJB JAR
|--- Util 1 JAR
|--- Util 2 JAR
|--- etc.
Vì vậy, tôi đang tìm cách tạo đối tượng đơn lẻ Java sẽ hoạt động trên các WAR (qua Lớp nạp)? Chú thích EJB @Singleton
có vẻ khá hứa hẹn cho đến khi tôi phát hiện ra rằng JBoss 5.1 dường như không hỗ trợ chú thích đó (được thêm vào như là một phần của EJB 3.1). Tôi đã bỏ lỡ điều gì đó - tôi có thể sử dụng @Singleton
với JBoss 5.1 không? Nâng cấp lên JBoss AS 6 không phải là một tùy chọn ngay bây giờ.
Cách khác, tôi rất vui khi không phải sử dụng EJB để triển khai đĩa đơn của mình. Tôi có thể làm gì khác để giải quyết vấn đề này? Về cơ bản, tôi cần một hook * bán rộng ứng dụng vào một bó toàn bộ các đối tượng khác, giống như các dữ liệu được lưu trữ khác nhau và thông tin cấu hình ứng dụng. Như một phương sách cuối cùng, tôi đã xem xét việc sáp nhập hai WAR của tôi thành một, nhưng điều đó sẽ khá khủng khiếp.
* Ý nghĩa: có sẵn về cơ bản ở bất kỳ đâu trên một lớp nhất định; bây giờ, chủ yếu là trong WAR của tôi - xem và điều khiển (trong một ý nghĩa lỏng lẻo).
Chỉnh sửa: Tôi thực sự nên gọi nó là Java EE thay vì J2EE, phải không?
Chỉnh sửa 2: Rất cám ơn một lần nữa để @Yishai cho tất cả sự giúp đỡ. Sau khi một số thử nghiệm và lỗi có vẻ như tôi đã tìm ra cách sử dụng một ClassLoader duy nhất trên các WAR dưới JBoss 5. Tôi đang chi tiết điều này dưới đây vì lợi ích của riêng tôi, và hy vọng những người khác cũng sẽ thấy điều này hữu ích.
N.B. điều này khá khác với việc thực hiện điều này dưới JBoss 4 (xem câu trả lời của Yishai hoặc các liên kết của tôi bên dưới).
Thay vì viết một jboss-web.xml
cho mỗi WAR, và một jboss.xml
cho tai EJB-JAR, đặt một tập tin jboss-classloading.xml
trong mỗi WAR, trong cùng một vị trí như DD (web.xml
). Nội dung của jboss-classloading.xml
nên là:
<?xml version="1.0" encoding="UTF-8"?>
<classloading
xmlns="urn:jboss:classloading:1.0"
name="mywar.war"
domain="DefaultDomain"
parent-domain="Ignored"
export-all="NON_EMPTY"
import-all="true">
</classloading>
này xuất phát từ JBoss CW here, trong khi những gì (tôi nghĩ) làm việc cho JBoss 4.x được mô tả here. Xem thêm thông tin chung về JBoss classload (ing/ERS):
Như tốt nhất mà tôi có thể nói, các JBoss docs wiki cộng đồng đang khá thiếu cho JBoss 5 so với JBoss 4.
@Bears, re: the edit: Chỉ khi bạn làm việc trong bộ phận tiếp thị của Oracle. – Yishai