【问题标题】:How to create Restful service and deploy it OSGi container?如何创建 Restful 服务并部署它的 OSGi 容器?
【发布时间】:2013-03-25 17:14:23
【问题描述】:

我的目标是使用 Eclipse 创建一个 Restful 服务 Maven 项目。然后将其打包为一个捆绑包并将其部署到 Fuse ESB karaf OSGi 容器中。到目前为止,我所知道的是如何使用 JAX-RS API 注释,@Path @GET:

package com.restfultest;

import javax.ws.rs.GET;
import javax.ws.rs.Path;

@Path("/example")
public class ExampleService {

@GET
public String sayHello() {
    return "Hello Restful service";
 }
}

我的问题是: 1. 我应该使用什么 Maven 原型? maven-archetype-webapp 还是快速入门?

2.如何实现Activator?像这样?

public class Activator implements BundleActivator {

private ServiceRegistration<?> registration;

public void start(BundleContext context) throws Exception {
    // TODO Auto-generated method stub
    ExampleService exampleService = new ExampleService();
    registration = context.registerService( ExampleService.class.getName(), exampleService, null );
}

public void stop(BundleContext context) throws Exception {
    // TODO Auto-generated method stub
    registration.unregister();
}

}

3。如何注册和发布服务(如如何配置Endpoint地址和端口)?

我是 osgi 的新手。谁能给我一些资源或详细的教程?

【问题讨论】:

    标签: java eclipse rest maven osgi


    【解决方案1】:

    这是我的 5 美分:

    1。您应该使用什么 Maven 原型?

    • 我使用了 OSGI HTTP 服务(快速入门),查看this 示例,我认为它更自然。

    2。如何实现Activator?

    3。如何注册和发布服务?

    • 我建议您下载最新的jersey-ALL-bundle 并将其安装在您的 OSGI 上。
    • 然后,在我的特殊情况下,我使用Maven Bundle Plugin 来处理运行时的导入和打包,所以,我的 pom.xml 看起来像这样(请注意依赖关系):

      ...
      <packaging>bundle</packaging>
      <build>
          <plugins>
              <!--+
                  + OSGi Bundle-Manifiest Generator.
                  + -->
              <plugin>
                  <groupId>org.apache.felix</groupId>
                  <artifactId>maven-bundle-plugin</artifactId>
                  <version>2.3.7</version>
                  <extensions>true</extensions>
                  <configuration>
                      <instructions>
                          <Import-Package>javax.servlet.*;version="[2.4,4.0)",*</Import-Package>
                          <Bundle-Activator>com.sample.api.Activator</Bundle-Activator>
                          <Implementation-Title>jersey-osgi-http-service-bundle</Implementation-Title>
                          <Implementation-Version>${project.version}</Implementation-Version>
                      </instructions>
                      <unpackBundle>true</unpackBundle>
                  </configuration>
              </plugin>
          </plugins>
      </build>
      
      <dependencies>
          <!--+======================+-->
          <!--+ REST Dependencies    +-->
          <!--+======================+-->
          <dependency>
              <groupId>org.glassfish.jersey.containers</groupId>
              <artifactId>jersey-container-servlet-core</artifactId>
              <version>2.22.1</version>
          </dependency>
          <dependency>
              <groupId>org.apache.felix</groupId>
              <artifactId>org.apache.felix.http.bundle</artifactId>
              <version>2.2.0</version>
          </dependency>
          <!--+=========================================+-->
          <!--+ Apache Felix Framework (OSGi framework) +-->
          <!--+=========================================+-->
          <dependency>
              <groupId>org.apache.felix</groupId>
              <artifactId>org.apache.felix.framework</artifactId>
              <version>4.6.0</version>
          </dependency>
      </dependencies>
      
    • 在我的具体情况下,我也有 WebConsole installed,然后我的包看起来像这样:

       0|Active     |    0|System Bundle (4.6.0)
       1|Active     |    1|Apache Felix Bundle Repository (2.0.2)
       2|Active     |    1|Apache Felix Gogo Command (0.14.0)
       3|Active     |    1|Apache Felix Gogo Runtime (0.12.1)
       4|Active     |    1|Apache Felix Gogo Shell (0.10.0)
       5|Active     |    1|com.sample-api (1.3.0.SNAPSHOT)
       6|Active     |    1|jersey-all (2.22.1)
       7|Active     |    1|Apache Felix Log Service (1.0.0)
       8|Active     |    1|Apache Felix Configuration Admin Service (1.2.4)
       9|Active     |    1|Apache Felix Shell Service (1.4.2)    
      10|Active     |    1|Apache Felix Http Bundle (2.0.4)    
      11|Active     |    1|HTTP Service (1.0.0)    
      12|Active     |    1|Apache Felix Web Management Console (3.1.2)
      
    • 对于 Rest,拥有 6、10 和 11 包很重要。

    • 只要这样做,端口就可以在 OSGI(我使用 Felix)的“config.properties”中配置:

      org.osgi.service.http.port=28370
      
    • 然后,只需使用以下路径即可访问服务:

      http://localhost:28370/jersey-http-service/status
      

    【讨论】:

      【解决方案2】:
      1. 您可以使用Maven bundle plugin
      2. 和 3.Apache CXF DOSGi 帮助您将 OSGi 服务发布为 WS/REST。

      【讨论】:

        【解决方案3】:
        1. 您需要创建一个 OSGI 包。有一些原型可以创建 maven 项目:

        2. 您的激活器看起来正确。

        3. 这个问题我无法回答,但看起来这个项目可以满足您的需求:https://github.com/hstaudacher/osgi-jax-rs-connector

        一般来说,我建议您自己获取OSGI specification,这是一本很好的读物,并且解释了很多事情。

        【讨论】:

          猜你喜欢
          • 2013-12-24
          • 1970-01-01
          • 2020-09-22
          • 1970-01-01
          • 1970-01-01
          • 2010-10-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多