2012-06-11 39 views
10

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

+0

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 –

Trả lời

14

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.

+1

DS - Dịch vụ khai báo – Robin

+0

@Robin Tôi luôn trộn từ viết tắt đó vào đầu mình - đã sửa. – maasg

3

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.

4

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.

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