2016-09-22 23 views
8

Trong ngữ cảnh của một ứng dụng Java EE 6 chạy trên WebSphere 8.0, tôi cần thực hiện một số tác vụ khởi động trước khi bất kỳ phương thức kinh doanh nào có thể được thực thi. Sử dụng một @Startup @Singleton bean cho mục đích này có vẻ như một giải pháp đầy hứa hẹn. Tuy nhiên, nó không hoàn toàn rõ ràng đối với tôi chính xác vòng đời của ứng dụng trông như thế nào. Số điện thoại EJB 3.1 spec quy định như sau:@Singleton @Startup @PostConstruct phương thức được đảm bảo trả lại trước khi EJB có sẵn cho các cuộc gọi của khách hàng?

Theo mặc định, vùng chứa có trách nhiệm quyết định khi nào khởi tạo thể hiện bean Singleton. Tuy nhiên, nhà phát triển bean có thể tùy chọn cấu hình Singleton để khởi tạo mong muốn. Nếu chú thích khởi động xuất hiện trên lớp đậu Singleton hoặc nếu Singleton được chỉ định thông qua bộ mô tả triển khai là yêu cầu khởi tạo mong muốn, vùng chứa phải khởi tạo thể hiện bean Singleton trong trình tự khởi động ứng dụng. Thùng chứa phải khởi tạo tất cả các Singletons khởi động trước khi bất kỳ yêu cầu nào của khách hàng được gửi đến bất kỳ thành phần bean nào của doanh nghiệp trong ứng dụng.

  1. Trong câu cuối cùng, chính xác cấu thành "khởi tạo" là gì? Vùng chứa có đợi phương thức @PostConstruct của @Startup bean trả về trước khi tạo các bean doanh nghiệp có sẵn cho các yêu cầu của khách hàng không?

  2. Nói về "yêu cầu của khách hàng", thực hiện theo lịch trình phương pháp EJB với số chú thích @Scheduled là một trong ngữ cảnh này?

tôi cần phải đảm bảo rằng một số mã được thực thi khi khởi động ứng dụng trước khi bất kỳ phương pháp kinh doanh trong bất kỳ EJB khác nhau của ứng dụng có thể chạy, có thể là thông qua các cuộc gọi của khách hàng hoặc hành theo lịch trình. Việc chạy mã khởi động bên trong phương thức @PostConstruct của một @Singleton @Startup bean có đảm bảo như vậy không? Nếu không, có cách nào khác để đảm bảo hành vi này không?

+0

Vâng, nó chắc chắn sẽ là thiết kế tồi cho máy chủ ứng dụng để phân phát các hạt vẫn đang chạy phương thức '@ PostConstruct' của chúng. – Kayaman

+1

@Kayaman Có sự khác biệt giữa việc phân phối các hạt ở giữa các phương thức '@ PostConstruct' của chúng và ngăn các cuộc gọi đến * tất cả * bean trong khi * bất kỳ *' @ Startup' bean nằm trong phương thức '@ PostConstruct' của nó, đó là hành vi theo yêu cầu của spec. –

+0

@BrettKail Thực tế là có. Người thứ hai bảo đảm rằng người trước đây không thể xảy ra. Tuy nhiên kể từ khi trích dẫn của ông không đề cập rõ ràng '@ PostConstruct', tôi tin rằng ông đã tự hỏi liệu' @ PostConstruct' có phải là một phần của việc khởi tạo hay không. – Kayaman

Trả lời

6
  1. Có, vùng chứa đợi phương thức @PostConstruct của tất cả @Startup đậu trong mô-đun ("ứng dụng EJB") để trả lại trước khi cho phép bất kỳ yêu cầu nào của khách hàng. Có, đây là trường hợp trong Máy chủ ứng dụng WebSphere như ngụ ý bởi chủ đề Developing singleton session beans trong Trung tâm kiến ​​thức, mà nói "Một phương pháp PostConstruct trong một bean đơn có thể tạo ra một bộ đếm thời gian EJB [...] Tuy nhiên, để tránh một bế tắc , phương thức PostConstruct không được chờ bộ hẹn giờ EJB chạy "#:. Nói cách khác, các lời gọi lại gọi lại hẹn giờ sẽ đợi các phương thức @PostConstruct hoàn thành, vì vậy các phương thức @PostConstruct không được chờ các lời gọi lại gọi lại hẹn giờ hoàn tất.
+0

Đây chính xác là những gì tôi đang tìm kiếm. Cảm ơn! –

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