2011-10-21 42 views
6

Tôi đang sử dụng Apache Aries 0.2 trong Servicemix 4.3.1 và tạo cm: managed-service-factory. Việc tạo các dịch vụ với các tệp .cfg hoạt động tốt (ngoại trừ #ARIES-584), nhưng các thuộc tính từ tệp .cfg không được tiêm vào đối tượng dịch vụ. Chúng được thiết lập đúng trong ConfigAdmin, chỉ các phương thức setter bean của tôi không bao giờ được gọi cho các giá trị trong tệp cấu hình của tôi. Tôi đã nghĩ tôi có thể sử dụng một cm: quản lý tài sản hoặc một cái gì đó giống như lồng nhau bên trong nhà máy dịch vụ quản lý của tôi, nhưng điều đó sẽ yêu cầu một pid riêng biệt, do đó, không có vẻ đúng.Nhà máy quản lý-dịch vụ của Aries có quản lý tài sản không?

Nếu tôi không đặt thẻ thuộc tính vào, thì không có giá trị nào được đặt. Với thẻ thuộc tính, thì chỉ giá trị mặc định được đặt, nhưng không bao giờ là giá trị tệp cấu hình thực.

Tôi không thể tìm thấy bất kỳ tài liệu nào để sử dụng tiểu dự án Aries CM, ngoại trừ blueprint-sample.xml, không hiển thị thuộc tính được quản lý bên trong nhà máy dịch vụ được quản lý. Tôi đã thực sự cố gắng sử dụng Servicemix, nhưng xung quanh mọi góc đều thiếu tài liệu, các tính năng bị hỏng hoặc bị thiếu hoặc các lỗi ảnh hưởng đến chức năng cốt lõi.

Cả tài liệu springgemini chỉ ra rằng triển khai nhà máy dịch vụ được quản lý của họ cũng phải hoạt động như thuộc tính được quản lý.


foo.xml:

<blueprint> 
    <cm:managed-service-factory id="myfoo-msf" factory-pid="my.msf" interface="my.IFoo"> 
    <cm:managed-component class="my.Foo"> 
     <property name="name" value="default /> 
    </cm:managed-component> 
    </cm:managed-service-factory> 
</blueprint> 

IFoo.java

package my; 
public interface IFoo { 
    public String getName(); 
    public void setName(String name); 
} 

Foo.java

package my; 
public class Foo implements IFoo { 
    private String name; 
    public void setName(String name) { 
    this.name = name; 
    System.out.println("name set to: " + name); 
    } 
    public String getName() { 
    return name; 
    } 
} 

my.msf-1.cfg

name=name1 

my.msf-2.cfg

name=name2 

System.out

name set to default 
name set to default 

config: proplist

service.pid = my.msf.xxxxxxx-xx-xx-xxxxxxxxxxxxxxx 
name = name1 
service.factoryPid = my.msf 

service.pid = my.msf.yyyyyyy-yy-yy-yyyyyyyyyyyyyyy 
name = name2 
service.factoryPid = my.msf 
+0

Tôi đã thử tính năng này bằng cách sử dụng Spring và các thuộc tính được tải đúng từ tệp cấu hình vào dịch vụ của tôi bằng phương thức setter ... Tôi thậm chí không phải đặt thẻ thuộc tính vào. , nhưng tôi không thể làm dịch vụ tài sản với mùa xuân: (... Spring # OSGI-747. Tại sao không có một thực hiện làm việc duy nhất này. –

+0

Tôi đã thử DS cho điều này, và nó có vẻ làm việc. –

Trả lời

0

Tôi tin rằng bạn phải bổ sung thêm một dòng trong phần quản lý thành phần của bạn.

<blueprint> 
    <cm:managed-service-factory id="myfoo-msf" factory-pid="my.msf" interface="my.IFoo"> 
    <cm:managed-component class="my.Foo"> 
     <cm:managed-properties persistent-id="" update-strategy="container-managed"/> 
     <property name="name" value="default /> 
    </cm:managed-component> 
    </cm:managed-service-factory> 
</blueprint> 

Giá trị mặc định thực sự sẽ bị ghi đè vào bất kỳ tệp cfg nào của bạn. Nếu nó quan trọng, giá trị mặc định của thuộc tính setter sẽ được gọi ra, tiếp theo là cùng một thuộc tính setter với giá trị từ cfg.

Trong trường hợp này, tôi đã sử dụng quản lý vùng chứa cho chiến lược cập nhật. Nhưng bạn có thể sử dụng thành phần được quản lý.

Điều này có vẻ không cần thiết đối với tôi và có mùi vị kém. Tại sao tôi cần đặt một thuộc tính được quản lý khác trong bean của tôi bằng id liên tục trống khi tôi đã làm như vậy ở trên? Có lẽ có một cách tốt hơn nhưng điều này dường như làm việc.

Ngoài ra, không có cách rõ ràng nào ảnh hưởng đến Thuộc tính dịch vụ được quảng cáo. Ví dụ, chúng ta có thể muốn có một quy ước rằng bất kỳ thuộc tính cfg nào bắt đầu với dịch vụ: xxx sẽ được chuyển tới các thuộc tính của Dịch vụ.

Cập nhật: Kiểm tra Apache Aries khá hữu ích. Chúng có thể được tìm thấy ở đây http://aries.apache.org/downloads/currentrelease.html. Cụ thể, hãy xem phần quản lý cấu hình, org.apache.aries.blueprint.cm. Trong thư mục thử nghiệm nó có một số ví dụ. Nó cho thấy rằng ngoài phần tử cm: managed-properties trong cm: managed-component được hiển thị ở trên, cũng có một tùy chọn để có một phần tử cm: cm trong thuộc tính service.

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