2012-06-22 32 views

Trả lời

17

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 getServiceReferencescreateFilter 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.

+1

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

+0

@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ù. –

+0

@LucaGeretti có cách nào thông minh hơn để tìm các dịch vụ OSGI khai báo không? –

7

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) { 
    // ... 
} 
+0

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

+0

@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") –

2

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)"/> 
+0

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

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