2009-12-21 27 views
8

Tôi hiện đang thử nghiệm osgi (Spring DM) trên một ứng dụng mới. Ứng dụng cần có khả năng nghe các sự kiện hệ thống tập tin. Hôm nay tôi đã giải quyết điều này với một poller dựa trên thời gian đơn giản, nhưng khi Java 7 được phát hành, tôi có thể muốn thay thế bằng một thực hiện dựa trên NIO2.Các gói osgi khác nhau với việc triển khai cùng một giao diện - nơi đặt giao diện inferface đó?

Cho đến nay, tôi đang xem xét ba gói, hai gói cho việc triển khai dịch vụ tệp và một cho logic nghiệp vụ tiêu thụ một trong các dịch vụ. Hai triển khai nên thực hiện cùng một giao diện vì vậy câu hỏi của tôi là, nơi để đặt giao diện đó? Việc đặt giao diện trong gói chứa việc triển khai sẽ khiến dịch vụ phụ thuộc vào một trong những người tiêu dùng của nó.

Cách tốt nhất và giống như osgi nhất để cấu trúc điều này là gì? Cho đến nay, đặt cược tốt nhất của tôi là tạo một gói "api" mới xác định các giao diện chung cho việc triển khai.

+0

Tôi nghĩ rằng bạn đang "mô-đun api" Ý tưởng là con đường để đi. – skaffman

Trả lời

8

Tách rời api-bundle có lẽ là lựa chọn tốt nhất. Nó cho phép bạn thay thế gói implent sau này. Ngoài ra, với gói api riêng biệt, bạn có thể thay thế gói hiện tại của mình một cách nhanh chóng mà không cần người tiêu dùng phải khởi động lại nữa.

Lớp học (và giao diện) được nhận dạng theo tên và trình tải lớp. Vì vậy, nếu bạn đặt giao diện dịch vụ trong cùng một gói khi triển khai, bạn sẽ mất khả năng thay thế bó chạy nóng. Mặc dù giao diện có cùng tên và giống hệt nhau trong mỗi gói mới được triển khai có trình nạp lớp khác nhau => consumer xem giao diện gói mới được triển khai như một lớp mới và các phụ thuộc của nó không còn đáp ứng.

Để biết thêm thông tin về khả năng tương thích dịch vụ và các phiên bản (xem ý kiến): http://wiki.osgi.org/wiki/Service_Compatibility

+3

Ngoài ra, bạn nên sử dụng gói phiên bản. Bằng cách này, bạn thậm chí có thể có các phiên bản khác nhau của cùng một gói API và thậm chí cả cùng một dịch vụ được triển khai trong một khung công tác. – akr

+1

Trong khi bạn có thể làm điều đó với OSGi, nếu bạn có các phiên bản khác nhau của cùng một API, điều này sẽ chia ứng dụng của bạn thành các khu vực sử dụng từng phiên bản và có thể sẽ không thể hợp tác rất tốt, vì sẽ có trình nạp lớp không tương thích. Ví dụ: theo mặc định OSGi sẽ không làm cho các dịch vụ triển khai phiên bản API khác nhau hiển thị. – Thilo

+0

Điều đó đúng. Tôi chỉ muốn chỉ ra rằng điều thực sự quan trọng là sử dụng phiên bản ở đây trong trường hợp, ví dụ, chỉ có một gói (thực hiện hoặc API) được cập nhật. Nếu không, bạn có thể kết thúc trong một mớ hỗn độn bởi vì bạn không thấy rằng API, gói triển khai và gói sử dụng không khớp. Bạn có thể giải thích ý của mình với "trình nạp lớp không tương thích" không? – akr

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