Làm cách nào để phân biệt giữa các dịch vụ OSGI đã xuất bản có cùng giao diện với các thuộc tính của chúng?Tìm kiếm các dịch vụ OSGI theo các thuộc tính
Trả lời
Giả sử bạn muốn truy xuất dịch vụ đã đăng ký dựa trên các giá trị nhất định cho thuộc tính, bạn cần sử dụng bộ lọc (dựa trên cú pháp LDAP).
Ví dụ:
int myport = 5000;
String filter = "&(objectClass=" + MyInterface.class.getName()
+ ")(port=" + myport + ")";
ServiceReference[] serviceReferences = bundleContext.getServiceReferences(null,filter);
nơi bạn muốn tìm kiếm các dịch vụ cả hai thực hiện MyInterface
và có một giá trị của tài sản port
bằng myport
.
Here là javadoc có liên quan để nhận tham chiếu.
Ghi chú 1:
Ví dụ trên và javadoc tham khảo các phiên bản 4.2. Nếu bạn không bị giới hạn trong thời gian chạy J2SE 1.4, tôi khuyên bạn nên xem Bản phát hành 4.3 syntax, nơi bạn có thể sử dụng Generics.
Ghi chú 2: (kê biếu không của Ray)
Bạn cũng có thể pre-kiểm tra tính chính xác của bộ lọc của bạn bằng cách thay vì tạo ra một đối tượng Filter từ một chuỗi filterStr
:
Filter filter = bundleContext.createFilter(filterStr);
mà còn cho phép bạn để phù hợp với bộ lọc với các tiêu chí khác. Bạn vẫn vượt qua filterStr
để nhận được các tham chiếu, vì không có quá tải mà chiếm một đối số Filter
. Tuy nhiên, xin lưu ý rằng theo cách này, bạn sẽ kiểm tra tính chính xác hai lần: cả hai getServiceReferences
và createFilter
ném InvalidSyntaxException
khi phân tích cú pháp bộ lọc. Chắc chắn không phải là một sự thiếu hiệu quả của show-stopper, tôi đoán, nhưng nó đáng nói đến.
Câu trả lời của Luca ở trên là chính xác, tuy nhiên, giả sử bạn đang sử dụng API cấp thấp để truy cập dịch vụ.
Nếu bạn đang sử dụng Dịch vụ khai báo (mà tôi thường khuyên dùng) thì bộ lọc có thể được thêm vào thuộc tính target
của tham chiếu dịch vụ. Ví dụ: (sử dụng chú thích bnd cho DS):
@Reference(target = "(port=8080)")
public void setHttpService(HttpService http) {
// ...
}
Tôi thực sự muốn có một hướng dẫn kỹ lưỡng về cách sử dụng DS (+ chú thích). Neil, bạn có biết một cái (ngay cả khi mua)? Giả sử 4.2 (4.3 nhiều nhất). – Ray
@Ray: theo như sách đi, không xử lý chú thích bnd vì chúng không nằm trong tiêu chuẩn. Đối với DS tôi sẽ đề xuất cuốn sách "OSGi và Equinox" (R4.2, vẫn không có cuốn sách nào cho R4.3 ngoại trừ một số tham chiếu trong "OSGi in Depth") –
Trong Blueprint bạn có thể chỉ định thuộc tính bộ lọc trên phần tử tham chiếu hoặc danh sách tham chiếu. Ví dụ:
<reference id="sampleRef"
interface="org.sample.MyInterface"
filter="(port=5000)"/>
không hoạt động, bạn nhận được Yêu cầu không thỏa mãn (s)): --------------------------- dịch vụ: (& (dịch vụ = MyInterface) (cổng = 5000)) [container- name] khi bắt đầu vùng chứa (Tên nhóm và tên vùng chứa đã thay đổi một cách thích hợp). Không biết lỗi đó đang cố nói gì. Rất tiếc, chúng tôi đang sử dụng công cụ cầu chì được ghi lại vô vọng ... – StripLight
- 1. API quản lý dịch vụ Web Exchange - Tìm các mục theo thuộc tính mở rộng
- 2. Xuất các thành phần Spring dưới dạng dịch vụ OSGi
- 3. Tích hợp các dịch vụ Guice và OSGi
- 4. Symfony2 - Tìm các dịch vụ được gắn thẻ theo lệnh
- 5. Điều gì khác biệt giữa Trình theo dõi dịch vụ OSGi và Dịch vụ khai báo
- 6. tìm các phần tử theo thuộc tính với lxml
- 7. Cách theo dõi các dịch vụ Windows
- 8. IntelliJ đang khiếu nại về thuộc tính tham chiếu OSGi
- 9. Tìm kiếm văn bản trong các thuộc tính Truy cập các đối tượng
- 10. Sử dụng các dịch vụ khai báo OSGi trong ngữ cảnh của một thử nghiệm JUnit
- 11. Doctrine2: Truy vấn đa hình: Tìm kiếm trên các thuộc tính của các lớp con
- 12. Tham khảo dịch vụ trong OSGi
- 13. Thiết kế API dịch vụ web: Các phần tử XML so với các thuộc tính
- 14. Tìm XElement theo giá trị thuộc tính
- 15. Tìm kiếm các phụ thuộc trả về không có gì
- 16. Tìm nạp AutoCompleteTextView các đề xuất từ dịch vụ theo từng chủ đề riêng lẻ
- 17. tìm phần tử theo thuộc tính css
- 18. Cài đặt các phụ thuộc OSGi với maven-bundle-plugin
- 19. MongoDB Tìm kiếm theo tên thuộc tính cho bất kỳ Tài liệu nào có thuộc tính đó
- 20. WCF Service, loại được cung cấp như các giá trị thuộc tính dịch vụ ... không thể tìm được
- 21. Trạng thái của Dịch vụ quản trị triển khai OSGi
- 22. Dịch vụ WCF có cung cấp các đặc tính không?
- 23. Tìm kiếm các tệp Google Drive dựa trên tài nguyên thuộc tính mới
- 24. OSGi JAX-RS và dịch vụ khai báo bnd
- 25. Khởi động lại dịch vụ với các dịch vụ phụ thuộc?
- 26. Làm thế nào để tìm kiếm theo giá trị thuộc tính
- 27. chạy Tìm kiếm Đàn hồi dưới dạng dịch vụ Windows
- 28. Nhận các dịch vụ OSGi từ một gói trong Sling/CQ
- 29. Không thể tìm thấy dịch vụ vì gói OSGi không được kích hoạt
- 30. Tìm kiếm và thay thế các thuộc tính được định dạng bên trong chuỗi Java
Tôi chỉ thêm rằng việc xác thực cú pháp bộ lọc bằng bộ lọc Filter = bundleContext.createFilter (filterStr) sẽ là tốt; đầu tiên, chỉ để kiểm tra độ tỉnh táo sớm, đặc biệt là việc tạo bộ lọc động hơn. – Ray
@Ray: một nhận xét tốt để thực hiện. Thật không may là OSGi không ép buộc (hoặc thậm chí cho phép) để vượt qua Filter như một đối số, mặc dù. –
@LucaGeretti có cách nào thông minh hơn để tìm các dịch vụ OSGI khai báo không? –