Tôi đang làm việc trên Dịch vụ OSGi ngay bây giờ và tôi có câu hỏi về việc sử dụng Dịch vụ trong OSGi. Có một số cách khác nhau để đăng ký dịch vụ người dùng. Ai có thể giải thích sự khác biệt giữa dịch vụ theo dõi dịch vụ OSGi và dịch vụ khai báo? Cái nào tốt hơn?Điều gì khác biệt giữa Trình theo dõi dịch vụ OSGi và Dịch vụ khai báo
Trả lời
Trong OSGi, các ServiceTracker là một cách có lập trình để có được một tham chiếu đến một dịch vụ. tức là bạn viết mã ServiceTracker để "theo dõi" một tham chiếu đến một dịch vụ khác và cho phép bạn sử dụng nó khi nó có sẵn.
Ngược lại, Dịch vụ khai báo (DS), cho phép bạn khai báo các phụ thuộc được đưa vào thành phần của bạn. DS là một dạng tiêm phụ thuộc. Biểu đồ phụ thuộc giữa các dịch vụ, cùng với thứ tự bắt đầu sẽ xác định thời điểm dịch vụ của bạn bắt đầu. Thuộc tính cardinality trong định nghĩa DS cho phép bạn khai báo xem mối quan hệ là bắt buộc hay không (1..1), bội số có ít nhất một (1..n), tùy chọn (0..1) hoặc nhiều tùy chọn (0..n)). Khi bạn khai báo các mối quan hệ bắt buộc, dịch vụ của bạn sẽ không bắt đầu cho đến khi tất cả các phụ thuộc được thỏa mãn. Khi bạn khai báo mối quan hệ tùy chọn, dịch vụ của bạn sẽ bắt đầu bất kể trạng thái của phụ thuộc, nhưng bạn cần phải cẩn thận trong mã mà tham chiếu đến dịch vụ của bạn có thể là null.
Từ góc nhìn thực tế, ServiceTracker có nhiều mã soạn sẵn để viết và duy trì. Do tính chất động của các dịch vụ OSGi, có nhiều trạng thái được đặc tả OSGi cho phép cần được xem xét. DS sẽ cung cấp cho bạn một cách rõ ràng để khai báo và duy trì sự phụ thuộc của bạn. Các phụ thuộc được định nghĩa rõ ràng sẽ giúp bạn duy trì tính nhất quán của môi trường thời gian chạy của bạn.
Trình theo dõi dịch vụ OSGi cho phép bạn đăng ký người nghe cho một số dịch vụ nhất định, để bạn có thể phản ứng khi dịch vụ đó khả dụng.
Dịch vụ tuyên bố, mặt khác, sử dụng ngầm theo dõi dịch vụ để trì hoãn việc thực thi mã kích hoạt gói cho đến khi các phụ thuộc dịch vụ được giải quyết.
và cái nào tốt hơn?
Nó khá đơn giản để tạo và sử dụng một số dịch vụ khai báo, đặc biệt là với các chú thích Apache Felix SCR và các plugin Apache Felix SCR Maven:
https://felix.apache.org/site/scr-annotations.html
https://felix.apache.org/site/apache-felix-maven-scr-plugin-use.html
Dịch vụ khai báo (DS) khá dễ sử dụng và bạn tránh một số mã soạn sẵn liên quan đến việc sử dụng ServiceTracker. Nếu bạn đi OSGI đơn giản, chỉ sử dụng ServiceTracker, bạn cần phải chăm sóc một số khía cạnh của bản chất động của các dịch vụ OSGI. Các dịch vụ có thể đến và đi và thành phần của bạn cần phải giải quyết nó. Nếu bạn sử dụng DS, hầu hết công việc này đã được thực hiện. Bạn chỉ cần xác định các tham chiếu đến các dịch vụ khác và DS sẽ tiêm các tham chiếu đó khi chúng có sẵn. DS sẽ kích hoạt thành phần của bạn khi các yêu cầu thành phần được đáp ứng.
Nếu bạn sử dụng chú thích Apache Felix SCR hoặc chú thích do bndlib cung cấp, bạn cũng có thể tránh viết xml theo yêu cầu của Dịch vụ khai báo. Gần đây, nhóm OSGI cũng đã xuất bản một chú thích của họ. Tôi nghĩ rằng những cái được cung cấp bởi bndlib và những người thân từ OSGI là rất giống nhau và tôi gần như chắc chắn công cụ bnd có thể xử lý cả hai.
Tôi đã sử dụng chú thích Apache SCR một thời gian trước đây, nhưng giờ tôi thích sử dụng bndlib hơn vì nó bao gồm chú thích cho Siêu dữ liệu và một số lớp giúp thực hiện Dịch vụ được quản lý dễ dàng hơn rất nhiều. Metatype là một đặc tả liên quan đến Managed Services. Về cơ bản, nó cung cấp siêu dữ liệu có thể được sử dụng bởi Config Admin implementations để cung cấp một giao diện thân thiện với người dùng hơn cho cấu hình của một thành phần.
Tôi biết hai lựa chọn thay thế khác: iPojo và Blueprint.
iPojo khá mạnh mẽ và giàu tính năng. Nó tóm tắt hầu hết các công cụ OSGI và bao gồm một số tính năng tốt đẹp như hỗ trợ EventAdmin và hỗ trợ ConfigAdmin.
Tôi đã sử dụng Blueprint một chút, nhưng vì sử dụng quá nhiều xml, tôi không thích nó nhiều lắm. Tôi nghĩ bạn có thể nói rằng Blueprint giống như Spring cho OSGI.
- 1. Sự khác biệt giữa Thành phần OSGi và Dịch vụ
- 2. OSGi JAX-RS và dịch vụ khai báo bnd
- 3. Sự khác biệt giữa WCF và Lớp Dịch vụ Miền Dịch vụ RIA là gì?
- 4. Sự khác biệt giữa, tải lại dịch vụ và khởi động lại dịch vụ là gì?
- 5. Sự khác biệt giữa servlet và dịch vụ web
- 6. Sự khác biệt giữa Dịch vụ WCF, Dịch vụ WCF RIA và Dịch vụ Dữ liệu WCF
- 7. Cách theo dõi các dịch vụ Windows
- 8. Sự khác biệt giữa dịch vụ web OData và REST
- 9. Tìm kiếm các dịch vụ OSGI theo các thuộc tính
- 10. Trạng thái của Dịch vụ quản trị triển khai OSGi
- 11. Sự khác nhau giữa Dịch vụ Cửa sổ, ứng dụng Dịch vụ WCF và ứng dụng dịch vụ web ASP.NET?
- 12. Sự khác biệt giữa các dịch vụ web theo định hướng thư và RPC
- 13. Tham khảo dịch vụ trong OSGi
- 14. Sự khác nhau giữa Bộ điều khiển và Dịch vụ là gì?
- 15. Sự khác biệt giữa API và dịch vụ web là gì?
- 16. Sự khác biệt giữa các gói dịch vụ và gói trang web là gì?
- 17. Sử dụng các dịch vụ khai báo OSGi trong ngữ cảnh của một thử nghiệm JUnit
- 18. Cách thích hợp để vô hiệu hóa dịch vụ OSGi khi bắt đầu dịch vụ là gì?
- 19. Sự khác nhau giữa dịch vụ web thông thường và dịch vụ web dựa trên xà phòng là gì?
- 20. Trong cửa sổ dịch vụ sự khác biệt giữa dừng và tạm dừng là gì?
- 21. Dịch vụ WCF và Dịch vụ Windows
- 22. Tích hợp các dịch vụ Guice và OSGi
- 23. Sự khác nhau giữa điểm cuối, dịch vụ và cổng khi làm việc với dịch vụ web là gì?
- 24. Dịch vụ RIA .NET/Dịch vụ WCF
- 25. Gói phần mềm OSGi có thể xuất bản một dịch vụ khai báo không?
- 26. Sự khác nhau giữa Ứng dụng Dịch vụ WCF và Thư viện Dịch vụ WCF là gì?
- 27. Dịch vụ web asp.net khác biệt và Ihttphandler
- 28. Dịch vụ báo cáo LocalReport và WIF
- 29. WF, WCF và dịch vụ khai báo (hoặc: Microsoft có ý nghĩa gì bởi "tuyên bố"?)
- 30. Triển khai Dịch vụ WCF
Cảm ơn mọi người. Tất cả câu trả lời của bạn đều hữu ích. Nhưng tôi chỉ có thể chọn –