2012-04-17 27 views
6

Tôi muốn di chuyển ứng dụng EE của mình sang OSGi. ứng dụng của tôi bao gồm các thư viện nghiệp vụ, các cơ sở dữ liệu JPA/Entities và một giao diện REST/WS. nó cũng có một máy khách web.OSGi JAX-RS và dịch vụ khai báo bnd

Tôi bắt đầu bằng cách tạo mẫu cấu trúc và làm cho tất cả các giao diện và các nhóm nói chuyện với nhau theo cách sạch sẽ OSGi. Tôi muốn sử dụng một đặc điểm kỹ thuật sạch càng nhiều càng tốt mà không có bất kỳ nhà cung cấp hoặc khung công cụ cụ thể nào.

Tôi đang sử dụng plugin bnd maven để tạo tệp kê khai và dịch vụ khai báo. Tôi muốn thực hiện một cuộc gọi từ các nguồn lực còn lại của tôi để một dịch vụ OSGi (trên bó khác) sử dụng tiêm như vậy:

@Path("some-resources") 
@Component 
public class SomeResources{ 

    private SomeService service = null; 

    @Reference 
    public void setController(SomeService service) { // <- this is never called 
    this.service = service; 
    } 

    @GET 
    @Produces(javax.ws.rs.core.MediaType.APPLICATION_XML) 
    public Object getSomeService() {     // <- called 
    try { 
     service.process("Hello World");    // <- Error null object 
    } 
    ... 

} 

Tôi có thể chú thích các tài nguyên với BND @Component@Resource có thể được tiêm? mọi thứ đều hoạt động tốt nhưng dịch vụ luôn luôn là rỗng.

Điều gì sẽ là cách để khai báo gói của tôi cho BND để biến nó thành gói web/wab?

tôi sử dụng bó maven:

<packaging>bundle</packaging> 

... 

     <plugin>      
       <groupId>org.apache.felix</groupId> 
       <artifactId>maven-bundle-plugin</artifactId> 
       <version>2.3.7</version> 
       <extensions>true</extensions> 
       <dependencies> 
        <dependency> 
         <groupId>biz.aQute</groupId> 
         <artifactId>bndlib</artifactId> 
         <version>1.50.0</version> 
        </dependency> 
       </dependencies> 
       <configuration> 
        <supportedProjectTypes> 
         <supportedProjectType>ejb</supportedProjectType> 
         <supportedProjectType>war</supportedProjectType> 
         <supportedProjectType>wab</supportedProjectType> 
         <supportedProjectType>bundle</supportedProjectType> 
         <supportedProjectType>jar</supportedProjectType> 
        </supportedProjectTypes> 
        <instructions> 
         <_include>-osgi.bundle</_include> 
        </instructions> 
       </configuration> 
       <executions> 
        <execution> 
         <id>bundle-manifest</id> 
         <phase>process-classes</phase> 
         <goals> 
          <goal>manifest</goal> 
         </goals> 
        </execution> 
        <execution> 
         <id>bundle-install</id> 
         <phase>install</phase> 
         <goals> 
          <goal>install</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin>      

... 

với các hướng dẫn BND

Web-ContextPath: my-root-http/rest/ 
Service-Component: * 
+0

Gần đây tôi đã gặp một vấn đề tương tự (dịch vụ không bị ràng buộc) và theo dõi nó xuống [gói chia tách] (http://wiki.osgi.org/wiki/ Split_Packages). Bạn đã thử đưa giao diện dịch vụ của mình vào một gói riêng chưa? –

+0

cảm ơn @ BjörnPollex cho đề xuất. Tôi có 3 gói, một với chỉ giao diện, một với việc triển khai dịch vụ và gói REST. Tôi đã chuyển nó trở lại gói REST để xem nó có hoạt động không nhưng không may mắn. Nếu những gì tôi đang làm là currect hơn có lẽ vấn đề là với SCR không tìm thấy xml DS của tôi. – Gadi

+0

cảm ơn bạn đã chỉnh sửa @donalfellows – Gadi

Trả lời

5

OSGi có một phần của đặc tả được gọi là dịch vụ từ xa. Trong rất ngắn nó hoạt động theo cách mà bạn có thể đăng ký dịch vụ với đặc tính dịch vụ đặc biệt và dựa trên các công nghệ thuộc tính nên nhận dịch vụ của bạn và tạo điểm cuối từ chúng. Nó không chỉ là về REST mà còn về bất kỳ công nghệ nào xử lý các cuộc gọi từ xa. Bạn có thể tìm thấy thông tin trong đặc tả lõi OSGi trong chương "Dịch vụ từ xa".

Vâng, đó là đặc điểm kỹ thuật nhưng ai thực hiện? Hiện tại có hai dự án lớn hơn tôi đã thử. CXF DOSGi và Eclipse ECF. Chúng cung cấp một số công nghệ hỗ trợ Đặc tả dịch vụ từ xa. CXF đặc biệt hỗ trợ Jax-RS dựa trên việc triển khai nó trên cả máy chủ và phía máy khách.

Vì tôi không muốn sử dụng các giải pháp cụ thể vào mùa xuân bên trong OSGi, tôi đã không sử dụng CXF vào cuối nhưng đã tạo giải pháp của riêng mình. Nó dựa trên đặc tả của Jersey và Remote Services. Khi một dịch vụ OSGi được xác định với service.exported.interfaces = * và service.exported.configs = org.everit.osgi.remote.jersey nó sẽ tạo một điểm cuối còn lại dưới/rest/path với HttpService. Gói của bạn không phải là một gói nhỏ, nó có thể là một gói đơn giản.

Tôi phải đề cập rằng nếu bạn tiếp xúc với dịch vụ của mình thông qua bất kỳ triển khai Dịch vụ từ xa nào, bạn nên chú thích Jax-RS vào giao diện do lớp ban đầu của bạn triển khai và hiển thị dịch vụ của bạn dựa trên giao diện đó.

Thay vì chú thích @Resource và @Component bên trong OSGi, tôi khuyên bạn nên sử dụng Blueprint (một phần của thông số OSGi) tương tự như Spring. Hiện tại Apache Aries và Gemini Blueprint thực hiện nó. Với kế hoạch chi tiết, bạn có thể dễ dàng tạo ra các hạt và nối chúng với nhau. Nếu đăng ký dịch vụ từ xa của bạn theo cách này, bạn có thể đặt bất kỳ thuộc tính nào với sự trợ giúp của kế hoạch chi tiết (giống như thuộc tính của một bean trong tệp tin spring applicationcontext.xml).

Bạn có thể tìm ứng dụng mẫu mà tôi đã thực hiện tại https://source.everit.biz/svn/everit-osgi/trunk/samples/jaxrs/(người dùng/mật khẩu: khách/khách).Có hướng dẫn giải thích cách các mẫu này có thể được bắt đầu và phát triển tại http://cookbook.everit.org

Tôi hy vọng ứng dụng mẫu giúp bạn bắt đầu với chương đặc điểm Dịch vụ từ xa.

Để xem cách sử dụng JPA và Injection (Kế hoạch chi tiết), bạn nên kiểm tra đặc tả tóm tắt OSGi để biết các khả năng và tìm việc triển khai bạn thích. Tôi cũng đã thực hiện một dự án mẫu dựa trên kế hoạch chi tiết và hibernate-jpa mà bạn có thể tìm thấy như là anh chị em của url mẫu mà tôi đã cung cấp.

Cập nhật

Ngoài ra còn có một JAXRS thực hiện mở rộng tôi thực hiện tại https://github.com/everit-org/osgi-remote-jersey. Xem README cho tài liệu. Nó khác với lần đầu tiên trong cách thức hoạt động dựa trên các thuộc tính dịch vụ bảng trắng.

2

Tôi đã gặp phải sự cố tương tự với OSGi, Dịch vụ khai báo và Jersey.

Tài nguyên có thể được chú thích bằng chú thích @Component và @Reference. Điều này sẽ hướng dẫn DS tạo một thể hiện của lớp SomeResource và đưa một tham chiếu hợp lệ vào cá thể này khi tất cả các phụ thuộc (tham chiếu) được thỏa mãn.

Lý do tại sao tham chiếu của bạn là rỗng là do việc triển khai JAX-RS sẽ tạo một phiên bản mới của lớp SomeResource cho mỗi yêu cầu web. Ví dụ này của lớp SomeResource không giống với lớp được tạo bởi DS.

tôi giải quyết vấn đề này bằng cách làm tài liệu tham khảo biến tĩnh với Java từ khóa tĩnh:

private static SomeService service = null; 

này đảm bảo rằng một tài liệu tham khảo phụ thuộc được gắn với một đối tượng lớp thay vì để một thể hiện và sau đó tất cả các trường có thể nhìn thấy giá trị tiêm .

Giải pháp này đã giới thiệu một vấn đề mới. Tham chiếu này phải được xóa trên sự kiện unbind (khi dịch vụ không khả dụng) vì nó sẽ không bị hủy khi một cá thể bị hủy.

+0

Lưu trữ các tham chiếu tĩnh vào các thành phần osgi không phải là một ý tưởng hay. –

0

Sự cố sẽ được giải quyết khi loại chú thích @Path sẽ được đăng ký làm bản thân dịch vụ. Với DS bạn có thể không chỉ tiêm các dịch vụ khác. Tôi đã phải đối mặt với vấn đề này gần một năm trước. Đó là lý do tại sao tôi đã viết một đầu nối OSGi JAX-RS nhỏ cung cấp cho bạn chính xác những gì tôi đã mô tả. Hãy thử nếu bạn thích: https://github.com/hstaudacher/osgi-jax-rs-connector

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