2012-11-22 16 views
7

Tôi có một dự án hiện có mà tôi cần cấu hình khác nhau. Điều này cần phải xảy ra mà không cần thay đổi mã lớn. Tôi thực sự hy vọng tôi bằng cách nào đó có thể làm điều này chỉ với cấu hình. Tôi đã dành 2-3 ngày qua để đọc tất cả mọi thứ tôi có thể tìm thấy về vấn đề này. Tôi hiểu những người xếp lớp học về thủy tinh và những gì có sẵn cho tôi. Glassfish 2.1 EJB 3.0 Hiển thị EJB cục bộ cho các ứng dụng khác đang chạy trong cùng một tên miền/jvm

Tôi có một dự án mẫu hiện tại có EJB xác định giao diện @Local. Ejb được triển khai bên trong mô-đun ejb làm mô-đun ejb vào miền thủy tinh. Bây giờ tôi đang cố gắng tìm một cách cho một ứng dụng khác được triển khai dưới dạng một tai vào cùng một miền, để có thể truy cập EJB đó thông qua giao diện cục bộ của nó.

Tôi đã đọc tài liệu cho biết điều này là không thể. Sau đó, tôi đã thấy các bài đăng trên đây tại StackOverflow và các trang khác trên web nói rằng điều đó là có thể. Nhưng, tôi không thể tìm ra giải pháp thực tế.

Khi điều tra, tôi đã nhận ra rằng @Local EJB không đăng ký chính nó lên jndi (ít nhất theo nhật ký), nếu tôi sử dụng trình duyệt JNDI thủy tinh, tôi cũng không thấy nó hiển thị. Vì vậy, nó có ý nghĩa với tôi, hoặc là nó không thể, hoặc việc triển khai dự án EJB là có lỗi, và bằng cách nào đó tôi cần để lộ nó.

@Remote là một khả năng, nếu nó có thể là tham chiếu và không có chi phí hoạt động. Nhưng phương pháp ưa thích cho phép truy cập @Local EJB thực sự là nhu cầu tối thượng.

Có ai biết tôi cần làm gì để hiển thị @Local EJB cho ứng dụng khác không? Hoặc điều này rõ ràng là không thể?

Tôi đang sử dụng Glassfish 2.1 Với EJB 3.0

Nếu Glassfish 2.1 có thể xử lý EJB 3.1 Tôi sẽ sẵn sàng để di chuyển đến nó nếu nó cung cấp khả năng này, nhưng tôi nghi ngờ nó là dễ dàng.

Vui lòng hỗ trợ. Cảm ơn bạn.

Tôi đang thêm tiền thưởng. Để hoàn thành tiền thưởng, nó sẽ được yêu cầu chạy 2 ứng dụng tai trong cùng một miền, trong đó A.ear chứa một @Local EJB được sử dụng bởi ứng dụng trong B.ear.

+0

Thông tin bổ sung: http://docs.oracle.com/cd/E18930_01/html/821-2418/beadh.html#beadl. Điều này là dành cho Glassfish 3.1, nhưng tài liệu chỉ ra điều tương tự trong 2.1. Tôi không thể làm việc này được. – guyumu

+1

có lẽ bạn nên giải thích động lực của bạn để làm điều này, nhưng như bạn đã đề cập, có những chủ đề khác ở đây đối phó với cùng một vấn đề, tôi chỉ đồng ý với câu trả lời jtahlborn: http://stackoverflow.com/questions/5681197/access -a-local-session-bean-from-another-ear (và sẽ không cố gắng làm điều đó) –

Trả lời

4

Liên kết @Peter cho bạn gần như giải quyết được vấn đề của bạn. (link)

Một thủ thuật cần được thực hiện để giải quyết vấn đề @ Xavier là cung cấp common.jar cho cả hai tai trong cùng một phiên bản (được nạp bởi cùng trình nạp lớp). Nếu bạn làm điều đó, lớp học ngoại lệ sẽ không được ném và bạn sẽ có thể sử dụng ejb với giao diện cục bộ.

Để làm điều đó, bạn cần đặt common.jar vào thư mục glassfish/domains/domain1/lib (thay thế tên miền 1 bằng tên miền của bạn). Theo cách này, jar này sẽ được tải bởi trình nạp lớp chia sẻ của Glassfish.

tôi đã thực hiện một thử nghiệm nhanh với Eclipse và Glassfish 3 với cấu trúc sau:

package com.example; 

JarShared 
- @Local class Server 

EarServer 
- EjbServer 
    - @Stateless class ServerBean implements Server 

EarClient 
- EjbClient 
    - @Stateless @LocalBean class ClientBean 

Lookup từ ClientBean:

InitialContext ic = new InitialContext(); 
Server server = (Server) ic. 
    lookup("java:global/EarServer/EjbServer/ServerBean!com.example.Server"); 

tôi đã không nhận ClassCastException và tôi có thể gọi phương thức mẫu từ ServerBean.

Ghi chú quan trọng:

  • cả EarServer và EarClient không nên chứa JarShared trong thư mục lib, họ nên tái sử dụng một trong đó là trong các lĩnh vực thư mục lib
  • nhớ khởi động lại sau khi thêm Glassfish JarShared với nó.
  • để làm cho cả hai dự án ejb biên dịch bạn phải thêm JarShared để xây dựng con đường của họ, nhưng không có gì hơn

Nếu bạn có thắc mắc, viết bình luận.

+0

Xin chào, cảm ơn bạn rất nhiều vì phản hồi của bạn. Tôi nghĩ rằng điều quan trọng bạn đề cập ở đây là thư mục tên miền/lib. Tôi nghĩ trước đây, tôi đã cố gắng sử dụng thư mục domains/lib/applibs, nhưng có thể thấy nó sẽ là vấn đề như thế nào. Tôi sẽ cố gắng giải pháp này ngày hôm nay, và báo cáo/bỏ phiếu trở lại :-) Cảm ơn bạn! :) – guyumu

+0

Tôi đã làm một số thử nghiệm, và đọc bài viết của bạn một lần nữa :) Tôi thấy bạn sử dụng glassfish 3.1 :) Tôi nghĩ rằng tôi chọn lên một xu hướng ở đây glassfish 3 thêm hỗ trợ cho điều này, và tôi đang trên một ngỗng hoang dã đuổi theo trên glassfish 2.1:/Đáng buồn là tôi không thể thay đổi thành glassfish 3. – guyumu

+0

Kiểm tra điều này: http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#SessionBeanGlobalJNDINameAssignment - đó là những quy tắc về tên JNDI dành riêng cho GF2 (GF3 cũng sử dụng vì lý do tương thích, tôi đoán) – MeTTeO

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