2012-01-16 38 views
37

Dưới OSGi, điểm khác nhau chính giữa Thành phần và Dịch vụ là gì? Như tôi đã hiểu, tất cả Dịch vụ phải là Thành phần, nhưng không phải tất cả Thành phần đều phải là dịch vụ.Sự khác biệt giữa Thành phần OSGi và Dịch vụ

Lợi ích của việc sử dụng cái này với ứng dụng mẫu khác là gì?

Trả lời

52

"Thành phần" ít được xác định chính thức hơn các dịch vụ.

Dịch vụ là đối tượng bất kỳ được đăng ký trong Đăng ký dịch vụ OSGi và có thể tra cứu bằng (các) tên giao diện của nó. Điều kiện tiên quyết duy nhất là một dịch vụ nên thực hiện một số giao diện ... bất kỳ giao diện nào. Ví dụ tôi có thể đăng ký một đối tượng runnable dưới giao diện java.lang.Runnable và khách hàng có thể tra cứu nó bằng cách sử dụng tên giao diện đó.

Một "thành phần" có xu hướng là đối tượng có vòng đời được quản lý, thường là bởi khung thành phần như Dịch vụ khai báo (DS), Kế hoạch chi tiết hoặc iPOJO. Xem this page trên Cộng đồng OSGi Wiki để thảo luận về các khung thành phần khác nhau có sẵn.

Một thành phần có thể có bất kỳ tính năng sau đây, kết hợp hoặc riêng:

  • Một thành phần có thể bắt đầungừng; điều này sẽ được coi là một thành phần "hoạt động", mặc dù đó cũng là một thuật ngữ không chính thức. Một thành phần không cần phải bắt đầu hoặc dừng lại được gọi là thụ động.
  • Một thành phần có thể tự xuất bản như một dịch vụ OSGi.
  • Một thành phần có thể liên kết với hoặc tiêu thụ dịch vụ OSGi.

Nói chung, sử dụng khung thành phần là cách dễ nhất để làm việc với các dịch vụ OSGi vì khung sẽ quản lý việc ràng buộc với các dịch vụ mà bạn muốn sử dụng. Ví dụ bạn có thể nói rằng thành phần của bạn "phụ thuộc vào" một dịch vụ cụ thể, trong trường hợp đó thành phần sẽ chỉ được tạo và kích hoạt khi dịch vụ đó khả dụng - và nó cũng sẽ bị hủy khi dịch vụ không khả dụng.

+1

bạn có thể cung cấp ví dụ về thành phần không phải là dịch vụ không? – santiagozky

+8

@santiagozky Chắc chắn rồi. Giả sử bạn muốn một thành phần ghi Server nằm trên socket và đáp ứng các yêu cầu trên TCP/IP. Khi thành phần bắt đầu, nó sẽ mở ổ cắm và tạo (các) luồng cần thiết để phục vụ khách hàng. Khi nó dừng lại, nó sẽ đóng (các) sợi và ổ cắm. Một ví dụ khác: một thành phần tạo ra một GUI bằng cách sử dụng Swing, SWT hoặc JavaFX. Cả các thành phần ví dụ này đều không phải là các dịch vụ, mặc dù chúng có thể sử dụng các dịch vụ * được xuất bản bởi các thành phần khác. –

+0

@neal, cảm ơn. Bây giờ tôi hiểu rồi. – santiagozky

6

EDIT: Xem câu trả lời của Neil Bartlett, tôi đã trả lời khá cụ thể các dịch vụ khai báo nhưng nó tinh tế hơn tôi đã nói không chính xác ở đây.

Tóm lại: Thành phần là người tiêu dùng dịch vụ không phải nhà cung cấp, Dịch vụ là phần mở rộng của Linh kiện đăng ký làm nhà cung cấp dịch vụ.

Một thành phần có vòng đời (de/activate and modify), quản lý phụ thuộc dịch vụ (un/bind).

Dịch vụ là phần mở rộng của thành phần; thông qua dịch vụ đăng ký, nó cung cấp dịch vụ của nó cho các gói khác, vv bằng cách xuất bản các giao diện và thuộc tính được triển khai.

Trường hợp sử dụng cho Dịch vụ là hiển nhiên, các trường hợp điển hình cho việc sử dụng Linh kiện cần quản lý vòng đời, cấu hình hoặc phụ thuộc dịch vụ, nhưng không cần/muốn xuất bản Thành phần để sử dụng trong nhóm.

+3

Tôi không đồng ý rằng "các thành phần không phải là nhà cung cấp".Một thành phần có thể là một người tiêu dùng hoặc một nhà cung cấp dịch vụ, hoặc cả hai, hoặc không. –

+0

Hi @Neil, AFAIK (và hãy sửa tôi ở đây) Tôi nghĩ một Thành phần không được đăng ký là Dịch vụ không thể bị ràng buộc bởi Hợp phần khác (ngay cả trong cùng một gói - chắc chắn có vẻ như trường hợp với Felix DS) – earcam

+3

Đó là sự thật nếu bạn giới hạn mình với định nghĩa DS của một thành phần. Trong Blueprint và các khung công tác khác, các thành phần có thể tiêu thụ hoặc được kết nối với các thành phần khác trong cùng một gói mà không có dịch vụ xuất bản. Tôi không nghĩ rằng điều này là có liên quan mặc dù: bạn có thể có một thành phần là dịch vụ, các thành phần KHÔNG dịch vụ, và dịch vụ không phải là thành phần .... –

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