Thursday, July 14, 2016

Chạy tiến trình Java sử dụng Java Service Wrapper

Java Service Wrapper cho phép bạn chạy một ứng dụng Java dưới dạng một dịch vụ trên Windows (Windows Service) hay trên Linux/Unix (UNIX Daemon). Nó cũng được sử dụng để giám sát sức khỏe ứng dụng của bạn và của JVM. Sử dụng Java Service Wrapper có hai ưu điểm vượt trội:
  • Tích hợp đơn giản, bạn không cần lập trình gì thêm trong ứng dụng.
  • Triển khai và cài đặt ứng dụng như một dịch vụ trên các nền tảng khác nhau.

Cũng vì lợi ích này mà hiện nay có rất nhiều nhà phát triển Java sử dụng Java Service Wrapper để triển khai các tiến trình trên server. Chi tiết bạn có thể xem trực tiếp trên trang chủ: Java Service Wrapper

Ứng dụng hỗ trợ 03 phiên bản:

  • Professional Edition: Bao gồm tất cả các tính năng cơ bản và nâng cao. Để sử dụng phiên bản này, bạn phải mua bản quyền ứng dụng.
  • Standard Edition: Bao gồm tất cả các tính năng cơ bản và một số tính năng nâng cao. Để sử dụng phiên bản này, bạn cũng phải mua bản quyền ứng dụng.
  • Community Edition: Bao gồm tất cả các tính năng cơ bản, không có tính năng nâng cao. Phiên bản này hoàn toàn miễn phí, nếu không sử dụng gì đặc biệt có lẽ phiên bản này cũng là đủ với các bạn.
Chi tiết về các tính năng của từng phiên bản, bạn xem tại địa chỉ: Java Service Wrapper: Product Features.

Để tải ứng dụng, bạn vào địa chỉ: Java Service Wrapper: Download. Để tiện lợi khi sử dụng, bạn tải bản Cross-Platform để có thể chạy trên mọi nền tảng, dĩ nhiên kích thước của bản này sẽ lớn hơn. Có lẽ đến đây bạn quan tâm làm thế nào để tích hợp được và Java Service Wrapper?. Có 04 cách tích hợp ứng dụng của bạn với Java Service Wrapper, trong đó có 03 cách bạn không cần phải thêm bất kỳ đoạn mã nào trong ứng dụng của bạn. Dưới đây là chi tiết cách tích hợp:

* C1: Sử dụng WrapperSimpleApp

Sử dụng lớp WrapperSimpleApp để chạy ứng dụng. Đây là cách đơn giản nhất để tích hợp ứng dụng với Wrapper. Theo cách này, bạn chỉ cần cấu hình lớp Main để khởi động ứng dụng. Cách này thích hợp với các ứng dụng chỉ có một lớp Main để khởi động ứng dụng.

Sử dụng các này có một nhược điểm về vấn đề giải phóng tài nguyên khi kết thúc ứng dụng. Khi Wrapper tắt JVM, nó không gọi trực tiếp tới ứng dụng để tắt ứng dụng, Wrapper sẽ tắt JVM bằng cách gọi lệnh System.exit() từ trong JVM. Vì thế nếu ứng dụng đã đăng ký Shutdown Hook thì ứng dụng sẽ được tắt một cách bình thường, còn ngược lại ứng dụng sẽ bị tắt một cách đột ngột, trong trường hợp này có thể ứng dụng chưa giải phóng hết tài nguyên khi tắt.

Khi tích hợp theo cách này, lớp WrapperSimpleApp sẽ thay thế lớp chính (Main class) của ứng dụng. Khi bật ứng dụng, lớp WrapperSimpleApp sẽ khởi tạo sau đó gọi lớp Main trong lớp trình, lớp main này được cấu hình trong tệp.
Để hiểu rõ hơn bạn xem ví dụ cấu hình tích hợp chạy JBOSS sử dụng WrapperSimpleApp:
* Trên Windows: Hướng dẫn tích hợp JBOSS sử dụng WrapperSimpleApp trên Windows
* Trên Windows: Hướng dẫn tích hợp JBOSS sử dụng WrapperSimpleApp trên Linux/UNIX

* C2: Sử dụng WrapperStartStopApp

Cách này giúp tích hợp các ứng dụng mà sử dụng một lớp để chạy ứng dụng và sử dụng một lớp khác để dừng ứng dụng (Ví dụ như Tomcat). Thông thường, các ứng dụng loại này sẽ mở một Socket khi chạy để nhận bản tin yêu cầu dừng ứng dụng. Khi đó một lớp sẽ được gọi để dừng ứng dụng. Theo cách này bạn phải cấu hình hai lớp: Một lớp để khởi động ứng dụng và một lớp để dừng ứng dụng.
Để hiểu rõ hơn bạn xem ví dụ cấu hình tích hợp chạy Tomcat sử dụng JWrapperStartStopApp:
* Trên Windows: Hướng dẫn tích hợp Tomcat sử dụng WrapperStartStopApp trên Windows
* Trên Windows: Hướng dẫn tích hợp JBOSS sử dụng WrapperStartStopApp trên Linux/UNIX

* C3: Sử dụng WrapperListener

Cách này cung cấp một cơ chế linh động để truy cập vào tất cả các tính năng của Wrapper, nhưng cách này yêu cầu bạn phải lập trình thêm trong ứng dụng. Trong ứng dụng, bạn phải tạo một lớp cài đặt lại các phương thức trong lớp giao diện WrapperListener, sau đó bạn tạo ra một thể hiện lớp này và đăng ký với WrapperManager. Nếu không có gì đặc biệt, tôi khuyên các bạn không nên sử dụng cách này vì phức tạp và phải sửa code ứng dụng.
Nếu bạn muốn tìm hiểu sâu về cách tích hợp này, bạn xem thêm tại Hướng dẫn tích hợp WrapperListener

* C4: Sử dụng WrapperJarApp

Đây là một phương thức đơn giản khác giúp bạn chạy một ứng dụng đã được cấu hình chạy như một tệp executable jar. Khi sử dụng cách này, JVM sẽ không đóng ứng dụng của bạn như bình thường để đảm bảo mọi tài nguyên ứng dụng đều đã được giải phóng mà nó thoát JVM bằng cách gọi System.exit().
Để hiểu rõ hơn bạn xem ví dụ cấu hình tích hợp chạy Hudson sử dụng WrapperJarApp:
* Trên Windows: Hướng dẫn tích hợp Hudson sử dụng WrapperJarApp trên Windows
* Trên Windows: Hướng dẫn tích hợp Hudson sử dụng WrapperJarApp trên Linux/UNIX

Về cơ bản, đọc các ví dụ từ trang Wrapper bạn đã có thể tự tích hợp được cho mình. Vì vậy trong bài này tôi không đi chi tiết, mà nói trong nhưng trường hợp ứng dụng cụ thể trong các bài viết sắp tới.

No comments:

Post a Comment