2009-12-04 31 views
8

Khi một thể hiện của dịch vụ OSGi được truy xuất từ ​​ngữ cảnh gói, nó sẽ trở nên vô hiệu khi dịch vụ dừng lại?Tham khảo dịch vụ trong OSGi

Thử nghiệm ban đầu của tôi cho thấy rằng thể hiện dịch vụ có thể được sử dụng ngay cả sau khi gói dịch vụ bị dừng, điều này mâu thuẫn với sự hiểu biết của tôi về bản chất động của OSGi.

Tôi cho rằng điều này sẽ tóm tắt những gì truy xuất dịch vụ (thông qua ServiceTracker) từ gói khác trong vùng chứa OSGi thực sự, nó có tạo ra một cá thể mới hay không cho phép bạn trỏ đến cá thể được đăng ký trong vùng chứa ?

Có bất kỳ mối nguy hiểm nào khi sử dụng dịch vụ sau khi dịch vụ đã bị dừng không?

Trả lời

5

Đây là câu hỏi rất hay vì vậy tôi đã tìm hiểu thông số kỹ thuật để tìm kiếm câu trả lời dứt khoát. Nó chỉ ra rằng có một phần toàn bộ nói về vấn đề này - xem phần 5.4 Tài liệu tham khảo cũ bắt đầu từ trang 132 của OSGi Service Platform Core Specification, Release 4, Version 4.2.

Để trả lời câu hỏi của bạn theo các đặc điểm kỹ thuật:

Hành vi của một dịch vụ mà trở nên không đăng ký là không xác định. Các dịch vụ như vậy có thể tiếp tục hoạt động bình thường hoặc đưa ra một ngoại lệ theo quyết định của họ.

Và để ngăn chặn vấn đề tiềm năng:

Gói phải lắng nghe sự kiện được tạo bởi khung để làm sạch và loại bỏ các tham chiếu cũ .

Đặc điểm kỹ thuật cũng cung cấp một số mẹo để giảm thiểu hậu quả của các tham chiếu cũ.

+0

Cảm ơn cho câu trả lời, tiếc là không một dứt khoát có hoặc không như tôi đã hy vọng! –

2

Bạn có quyền ở chỗ nó mâu thuẫn với bản chất động của OSGi. Tôi tin rằng không có gì đảm bảo rằng dịch vụ sẽ có sẵn, mặc dù các triển khai khác nhau của các container và dịch vụ OSGi có thể hoạt động khác nhau.

Ví dụ: nếu dịch vụ được tạo và đăng ký với Spring DM, thì dịch vụ được truy xuất thực sự là proxy dựa trên Spring đến triển khai cơ bản và triển khai vẫn có thể biến mất. Do đó, một tham chiếu dịch vụ đề cập trực tiếp đến việc thực hiện có thể giữ cho đối tượng đó bị loại bỏ, trong khi đó tham chiếu dựa trên proxy sẽ không.

1

Các đặc điểm kỹ thuật OSGi nói:

Gói là các đơn vị có thể nhìn thấy trong lập trình ứng dụng bình thường. Đối với ví dụ , khi một gói bị ngừng, tất cả các dịch vụ của nó sẽ không được đăng ký.

Vì vậy, bạn không thể nhận dịch vụ từ gói bị dừng. Nhưng về mặt kỹ thuật nó có thể có thể sử dụng nó, ít nhất là miễn là bạn giữ một tham chiếu đến đối tượng dịch vụ (không ai có thể lấy nó ra khỏi bạn và nó sẽ không được GC'd). Nhưng tôi không nghĩ rằng nó được tiết kiệm để sử dụng dịch vụ. Nó có thể phụ thuộc vào các tài nguyên bó khác, không có sẵn sau khi gói đã dừng.

0

Về câu hỏi của bạn cho dù có nguy hiểm khi sử dụng một thể hiện dịch vụ sau khi dịch vụ đã bị dừng hay không. Để trích dẫn từ thông số cốt lõi 4.2 (5.4 Tham khảo cũ):

Hành vi của dịch vụ trở thành không được đăng ký là không xác định. Các dịch vụ như vậy có thể tiếp tục hoạt động đúng cách hoặc ném ngoại lệ theo quyết định của chúng tôi.

Tôi không muốn trích dẫn toàn bộ phần của spec ở đây, nhưng các câu sau đây là một cuộc thảo luận tốt đẹp về sự nguy hiểm của việc sử dụng tài liệu tham khảo cũ:

Một tài liệu tham khảo cũ là một tham chiếu đến một Java đối tượng thuộc về đối với trình tải lớp của gói bị ngừng hoặc được liên kết với đối tượng dịch vụ chưa được đăng ký. Java chuẩn không cung cấp bất kỳ phương tiện chung nào để làm sạch các tham chiếu cũ và các nhà phát triển phải phân tích mã của họ một cách cẩn thận để đảm bảo rằng các tham chiếu cũ bị xóa.

Các tham chiếu cũ có thể gây hại vì chúng cản trở bộ thu gom rác Java thu thập các lớp và có thể là các trường hợp, của các gói bị dừng. Điều này có thể dẫn đến việc tăng bộ nhớ đáng kể khi sử dụng và có thể khiến việc cập nhật các thư viện mã gốc không thành công. Các gói sử dụng dịch vụ được khuyến nghị sử dụng Dịch vụ theo dõi hoặc Dịch vụ tuyên ngôn.

1

Khi một thể hiện của một dịch vụ OSGi được lấy từ bối cảnh bó không nó trở nên vô hiệu khi dịch vụ dừng lại?

Không, chính tham chiếu không bị vô hiệu. Miễn là một cái gì đó trong container đang giữ nó, nó cũng có thể không được GC'ed.

Tuy nhiên, việc nó có hữu ích hay không, chỉ phụ thuộc vào bản thân việc triển khai dịch vụ chứ không phụ thuộc vào vùng chứa.

Thử nghiệm ban đầu của tôi cho thấy trường hợp dịch vụ có thể được sử dụng ngay cả sau khi gói dịch vụ bị dừng. Điều này mâu thuẫn với sự hiểu biết của tôi về bản chất động của OSGi.

Thông số kỹ thuật tự cho biết rằng các tham chiếu đó không nên được tổ chức, nhưng tùy thuộc vào người thực hiện phải cẩn trọng để triển khai các thông số chính xác; có nghĩa là không có mâu thuẫn, chỉ có thực tế là bạn có thể triển khai và triển khai các gói không hoạt động chính xác theo các thông số kỹ thuật.

Tôi cho rằng điều này nắm những gì lấy một dịch vụ (thông qua ServiceTracker) từ một bó trong container OSGi thực hiện, nó tạo một đối tượng mới hay nó cung cấp cho bạn một con trỏ tới instance mà là đăng ký trong container?

Vùng chứa không tạo trường hợp dịch vụ mới, ngoại trừ trường hợp có ServiceFactory liên quan (xem thông số kỹ thuật). Tìm kiếm một dịch vụ nên luôn cung cấp cho bạn một con trỏ tới cá thể đã đăng ký trong vùng chứa.

Có bất kỳ mối nguy nào trong việc sử dụng cá thể dịch vụ sau khi ngừng dịch vụ không?

Điều đó chỉ phụ thuộc vào việc triển khai dịch vụ; tuy nhiên, bằng cách làm như vậy trong một nhóm, bạn sẽ tự động tạo một gói không phù hợp với thông số kỹ thuật.

Trong thực tế, nhiều dịch vụ được triển khai để giải phóng tài nguyên và tham chiếu và sẽ không phản hồi đúng cách nữa.

0

Tài liệu tham khảo dịch vụ không bao giờ được lưu giữ làm tài liệu tham khảo. Bạn nên luôn luôn tìm kiếm một dịch vụ trong thời gian chạy. Điều này liên kết bạn với api OSGI tuy nhiên, whihc không phải lúc nào cũng muốn.

Có một cái nhìn tại - OSGI serviceTracker - OSGI dịch vụ khai báo - OSGI Blueprint - Xuân DM - Peaberry - iPojo

đó tất cả chăm sóc bản tính năng động cho bạn, hầu hết trong số họ không có OSGI api để sử dụng.

Kính trọng,

Leen Toelen

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