2010-02-05 25 views
5

Tôi đang cố gắng hiểu những gì đảm bảo được cung cấp cho các sự kiện dịch vụ.Bảo đảm đặt hàng nào được cung cấp cho các cuộc gọi ServiceListener và ServiceTracker?

Thông số OSGi cho biết ServiceEvents là đồng bộ, tôi đã thực hiện điều này để ngụ ý rằng ServiceListener sẽ không nhận được cuộc gọi dịch vụChanged() với UNREGISTERING ServiceEvent cho đến khi cuộc gọi serviceChanged() với dịch vụ REGEERED đã hoàn tất. Điều này có đúng không?

Tôi cũng đã xem xét nguồn của ServiceTracker. Dường như cố gắng đối phó với tình huống mà hai cuộc gọi serviceChanged() này trùng lặp. Điều này có thể không?

Có bất kỳ đảm bảo tương tự nào về các cuộc gọi tới ServiceTrackerCustomizer không?

Trả lời

1

Đây là một vấn đề rất khó khăn. Khi một dịch vụ được đăng ký trong OSGi, sự kiện được xử lý và tất cả các bên thú vị được thông báo (người nghe dịch vụ, trình theo dõi dịch vụ và thời gian chạy dịch vụ khai báo). Mỗi bên quan tâm có cơ hội để xử lý sự kiện. Xử lý sự kiện có thể bao gồm đăng ký hoặc hủy đăng ký các dịch vụ bổ sung. Do hành vi đồng bộ của thông báo ServiceEvent, các sự kiện này sau đó được gửi đến các bên quan tâm. Trong một chuỗi phụ thuộc dài, bạn kết thúc với một cây thông báo, nơi bạn đi để đăng ký một dịch vụ duy nhất và nó gây ra một loạt các chàng trai mới để có được đăng ký. Tôi biết điều này bởi vì nó có thể thực hiện điều chỉnh hiệu suất OSGi khởi động một bài tập rất khó khăn, vì cuộc gọi dịch vụ đăng ký đơn giản của bạn đã bị tính phí cho việc kích hoạt dịch vụ của một số lượng dịch vụ không xác định.

Để trả lời cụ thể câu hỏi của bạn, đó không phải là mối quan tâm đa luồng với các sự kiện, đó là một sự kiện mang tính tham gia lại. Đó là anh chàng xử lý sự kiện đăng ký của bạn có thể lấy lại xung quanh với bạn với một thông báo sự kiện trước khi cây đầy đủ được xử lý. Đây là một trong những lý do mà họ khuyên bạn không bao giờ đăng ký hoặc hủy đăng ký dịch vụ trong khi giữ khóa, hoặc người nào khác bạn có thể bế tắc chuỗi điều phối sự kiện. Một cách tốt để giữ an toàn là có một cây phụ thuộc bó, không phải là một đồ thị. Các phụ thuộc vòng tròn giữa các bó, ngay cả khi các lớp biên dịch có thể gây ra các vấn đề thực sự.

Tôi hy vọng điều này sẽ hữu ích. Nếu bạn muốn đọc thêm về loại điều này, có một cuốn sách mới sắp ra trên OSGi và Equinox. Nó có sẵn trên cắt thô bây giờ và nên có sẵn trong in rất sớm. http://my.safaribooksonline.com/9780321561510

+0

Để tránh những cơn bão sự kiện này trong khi khởi động và để giữ một chút thứ tự bạn có thể sử dụng startlevels. – akr

+1

Nếu dịch vụ A được đăng ký thì mỗi ServiceListener quan tâm sẽ nhận được một cuộc gọi serviceChanged() với một sự kiện ĐĂNG KÝ cho dịch vụ đó. Có thể nhận được một cuộc gọi lại serviceChanged() gọi lại với sự kiện UNREGISTERING cho * cùng một dịch vụ A * trong khi sự kiện REGISTERED đang được xử lý không? Tôi không thể thấy rằng có thể khi bạn cần ServiceRegistration để hủy đăng ký dịch vụ và không có sẵn cho đến khi đăng ký hoàn tất, nhưng ... –

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