2015-07-04 18 views
17

Trong JBoss, trình tự của giai đoạn triển khai như thế nào? Thứ tự của đối tượng được khởi tạo là gì và có sẵn để sử dụng? Xét một ứng dụng doanh nghiệp (* .ear), kiểm tra tất cả các log triển khai (server.log) giai đoạn triển khai trông giống như:JBoss EAP 6.x hiểu giai đoạn triển khai - ResourceAdapters, EJB, jar, war

  1. Tất cả libs được triển khai - file .class được nạp và sẵn;
  2. Tất cả * .jar mô-đun được triển khai - các tệp .class được tải và khả dụng;
  3. Nếu một số * .jar là một EJB Jar, thông qua các tập tin cấu hình hoặc chú thích, cây JNDI được tạo ra (Ex ejb-jar.xml.);
  4. Nếu một số * .jar có cấu hình tệp persistence.xml, tất cả thực thể và liên kết đến nguồn dữ liệu được tải;
  5. Tất cả * .war mô-đun bắt đầu giai đoạn triển khai;
  6. Thông qua tệp cấu hình (web.xml), trình nghe và ngữ cảnh gốc được tải và các khía cạnh bảo mật cuối cùng.
  7. Tai được triển khai thành công.

Câu hỏi:

  • gì về các module adapter nguồn lực, các PersistenceContext và EJB Pool?
  • Khi tìm thấy tệp persistence.xml, kết nối với nguồn dữ liệu và bắt đầu với nhóm DB?
  • Vì nguồn dữ liệu (DB) được định cấu hình trong số standalone.xml hoặc domain.xml, khi nào xảy ra kết nối đầu tiên với nhóm DB? Khi tôi tiêm PersistenceContext và sử dụng EntityManager?
  • Khi nhóm EJB được tải và có sẵn để sử dụng?
  • Có đúng để nói rằng trong khi triển khai jar EJB, cây JNDI được tạo và sau đó có sẵn không?
  • Khi phát hiện EJB, nó được tải bên trong hồ bơi (như tham chiếu đến tiêm/tra cứu)?

Khi mô-đun .war chưa được triển khai, có thể là servlet hoặc người nghe được bắt đầu từ vùng chứa.

  • Điều gì sẽ xảy ra nếu một số đối tượng này (nghe, servlet) cố gắng sử dụng EJB hoặc PersistenceContext hoặc các đối tượng khác? Các đối tượng đó có sẵn không?
  • Có thể gặp sự cố bế tắc và treo chuỗi/giai đoạn triển khai không?

Trả lời

6
  • Có thể control the deployment order của lọ và chiến tranh trong application.xml sử dụng <initialize-in-order>true</initialize-in-order>
  • Các lifecycle of the resource adapters được điều khiển bởi connector architecture
  • Các lifecycle of Container-Managed Entity Managers được quản lý bởi JBoss. Giả sử bạn đang tiêm vào EJB bằng cách sử dụng @PersistenceContext, điều này xảy ra trước @PostConstruct.
  • Singleton EJB để khởi tạo có thể được định nghĩa bằng @DependsOn("OtherBean")
  • Bạn có thể đảm bảo các điểm cuối EJB có sẵn bằng cách sử dụng để triển khai trong viên đạn đầu tiên
  • Không chắc chắn nếu nó có thể khóa chết - đó là nhiều khả năng rằng bạn sẽ thấy một ngoại lệ JNDI
+0

Cảm ơn thông tin và các liên kết hữu ích. Bạn xứng đáng với tiền thưởng. Tôi đã chỉnh sửa câu hỏi của mình và thêm các câu hỏi khác liên quan đến giai đoạn triển khai và cách vùng chứa quản lý tài nguyên. – StarsSky

3

tôi sẽ cố gắng giải quyết phần còn lại của câu hỏi của bạn:

Khi một persistence.xml được tìm thấy, không một kết nối đến dat a-source và như vậy để bắt đầu DB pool?

Có, điều đó phải xảy ra (nếu chưa có kết nối), nếu không cấu trúc bảng (DDL) có thể là validated hoặc không được tạo.

Vì nguồn dữ liệu (DB) được định cấu hình trong tệp standalone.xml hoặc domain.xml, khi nào kết nối đầu tiên với nhóm DB? Khi tôi tiêm PersistenceContext và sử dụng EntityManager?

Câu trả lời cho câu hỏi này là: phụ thuộc. Nếu Datasource JDBC của bạn được cấu hình với kích thước hồ bơi tối thiểu MIN_POOL_SIZE> 0 và có cờ prefill được đặt thành true, thì WildFly sẽ tạo các kết nối MIN_POOL_SIZE cho máy chủ DB mà không cần triển khai. cần phải tắt/bật nguồn dữ liệu). Nếu không khi triển khai: nó được tạo ra bao nhiêu kết nối khi cần thiết (tùy thuộc vào những gì bạn thực hiện khi triển khai, nhưng đối với các ứng dụng đơn lẻ), ngoại trừ bạn đã xác định MIN_POOL_SIZE> 0 và cờ tối thiểu nghiêm ngặt được đặt thành true, trong đó trường hợp AT LEAST MIN_POOL_SIZE kết nối sẽ được tạo.

Khi nào bể EJB được tải và sẵn sàng để sử dụng?

Có sẵn để sử dụng sau khi triển khai mô-đun con EJB, với tất cả các phụ thuộc của nó.

Đúng để nói rằng trong khi EJB jar triển khai, cây JNDI được tạo và sau đó có sẵn?

tôi sẽ xây dựng mà theo cách sau: Sau khi (không trong) nó được kiểm tra rằng tất cả các EJB có thể được triển khai (ví dụ như tất cả các phụ thuộc của họ có thể được giải quyết), sau đó mục JNDI được tạo ra (trong JNDI cây). Theo những gì tôi nhận thấy, nếu một EJB không thành công, không có gì được triển khai, điều đó khiến tôi nghĩ rằng tôi đang ở đây.

[Khi mô-đun .war được triển khai] Điều gì sẽ xảy ra nếu một số đối tượng này (nghe, servlet) thử sử dụng EJB hoặc PersistenceContext hoặc các đối tượng khác? Các đối tượng đó có sẵn không?

Có, chắc chắn. Chúng tôi sử dụng tính năng này để thực thi một số mã init từ một servlet, khi tệp WAR được triển khai (ví dụ: để tạo một số thực thể với một số giá trị mặc định).

Có thể gặp sự cố bế tắc và treo luồng/giai đoạn triển khai không?

Về mặt lý thuyết có, thực tế là không (tôi nghi ngờ những người ở RedHat không nghĩ về điều này).


Một số mẹo: nếu bạn sử dụng MySQL, bạn có thể kiểm tra kết nối nào được thực hiện với máy chủ với show processlist. Nếu không, nếu bạn sử dụng Linux/Unix, bạn có thể kiểm tra tất cả các kết nối đã thực hiện với máy chủ DB của mình bằng netstat.

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