2011-07-01 14 views
7

Nhóm của tôi đang cố gắng phát triển một hệ thống mới dựa trên OSGi, và bây giờ chúng tôi có hơn 50 gói và tính. Vấn đề là, có sự phụ thuộc giữa các bó. Ví dụ, khi gói A khởi động, nó sẽ đăng ký một dịch vụ cho OSGi, và khi gói B khởi động, nó sẽ sử dụng dịch vụ đó. Do đó, tôi cần gói Khởi động sớm hơn gói B. Để thực hiện điều này, tôi đặt mức bắt đầu của gói A ít hơn gói B.Có hợp lý để sử dụng các Cấp độ Bắt đầu khác nhau để quản lý các phụ thuộc giữa các gói OSGi không?

Chúng tôi đã cố gắng sử dụng ServiceTracker để tránh đặt mức bắt đầu, nhưng khi số lượng dịch vụ ngày càng tăng lên, khó quản lý và hiểu toàn bộ hệ thống.

Tuy nhiên, tôi thấy bài viết này trên internet: OSGi and Start Levels. Tôi không chắc chắn với hai câu trong đó:

  • Thứ tự bắt đầu trong cấp độ bắt đầu không xác định!
  • Nói chung, khi làm việc với các cấp độ bắt đầu, không bao giờ phụ thuộc vào thứ tự bắt đầu. Hãy nghĩ về các cấp độ bắt đầu như một vấn đề quản lý chứ không phải vấn đề thời gian phát triển.

Điều đó có nghĩa là cấp độ bắt đầu sẽ không quyết định thứ tự bắt đầu? Sau đó, khi nào tôi nên sử dụng nó?

Có hợp lý để sử dụng các cấp độ bắt đầu khác nhau để quản lý sự phụ thuộc giữa các gói OSGi không?

Có thể làm cho tất cả các gói là một mô-đun động (sử dụng ServiceTracker để theo dõi tất cả các dịch vụ mà nó sử dụng), nhưng phải mất nhiều thời gian hơn và yêu cầu các nhà phát triển cao cấp.

Trả lời

9

câu trả lời của tôi là tương tự như Bertrand: bạn nên xem xét sử dụng một cấp cao hơn trừu tượng dựa trên thành phần cho giải pháp của bạn: SCR, iPOJO, Blueprint vv

Sử dụng mức khởi đầu để kiểm soát phụ thuộc là một chút như sử dụng ưu tiên luồng trong Java để sửa chữa các điều kiện chủng tộc. Chắc chắn, bạn có thể làm mọi thứ hoạt động, sắp xếp, trong một thời gian, nhưng bạn sẽ phát điên trong quá trình này - và cuối cùng bạn sẽ mất đi.

Mức bắt đầu hữu ích. Ví dụ kinh điển là nếu bạn cần hiển thị một màn hình giật gân trong khi khởi động ứng dụng GUI dựa trên OSGi của bạn bằng cách đặt mã cho nó trong một gói. Nếu không có các cấp độ khởi động thì không có cách nào để đảm bảo màn hình giật gân sẽ kết thúc hiển thị khi nó được cho là, nhưng việc sử dụng các mức bắt đầu sẽ trở nên tầm thường. Điều đó nói rằng, tôi đã sử dụng các cấp độ bắt đầu để giải quyết lỗi đặt hàng phụ thuộc trong các gói của bên thứ ba (ví dụ Spring), mặc dù điều này không liên quan đến việc đặt hàng dịch vụ, nhưng giả định về tìm tài nguyên (với Spring, XSD cho không gian tên tùy chỉnh tích hợp Spring).

+0

Nhóm của tôi đã sử dụng các cấp độ bắt đầu cho các vấn đề tương tự. Đó là một cách tuyệt vời để tìm kiếm các vấn đề và đó là một giải pháp ngắn hạn hữu ích nếu bạn không có thời gian để khắc phục sự cố cơ bản ngay lập tức. – Jon7

+0

+1 đến câu trả lời của rsteele. Tùy thuộc vào thứ tự bắt đầu giới thiệu sự mong manh cực kỳ. Một trường hợp sử dụng khác cho các mức bắt đầu mặc dù là tối ưu hóa. Các gói của bạn nên luôn luôn * LÀM VIỆC * bất kể thứ tự chúng được bắt đầu bằng ... tuy nhiên đôi khi một gói có thể cần phải thực hiện nhiều việc hoặc ít hơn tùy thuộc vào thứ tự bắt đầu của nó. Vì vậy, bạn có thể sử dụng các cấp độ bắt đầu để tối ưu hóa hiệu suất của ứng dụng của bạn, chỉ cần không phụ thuộc vào chúng cho chức năng thực tế. –

+0

Cảm ơn Neil. Tôi đã không xem xét vấn đề hiệu quả, nhưng nó có ý nghĩa rất nhiều. –

7

Sử dụng các mức khởi đầu để quản lý sự phụ thuộc giữa các dịch vụ là một ý tưởng tồi - Dịch vụ thành phần thời gian chạy (SCR) là một cách tốt hơn để quản lý điều đó, và nếu được thực hiện đúng sẽ chăm sóc tất cả các phụ thuộc, thứ tự khởi động, khởi động lại các thành phần khi các dịch vụ bắt buộc của chúng được khởi động lại, v.v.

Nếu bạn đang sử dụng Maven, plugin Felix SCR của Apache (http://felix.apache.org/site/scr-annotations.html) giúp dễ dàng tạo các dịch vụ do SCR quản lý chỉ bằng một vài chú thích Java. Mã của Apache Sling (http://sling.apache.org) có đầy đủ các ví dụ sử dụng mã này.

+0

Chúng tôi không sử dụng Maven và chúng tôi thay vì bằng felix. Bất kỳ đề xuất nào khác? –

+0

Equinox sẽ không tạo ra sự khác biệt nào với SCR, và nếu bạn không sử dụng Maven, bạn có thể sử dụng Bnd trực tiếp (http://www.aqute.biz/Bnd/Bnd) - đó là những gì mà Maven bổ sung mà tôi đã đề cập sử dụng dưới mui xe. –