【问题标题】:Start more than one servlet with Jetty使用 Jetty 启动多个 servlet
【发布时间】:2013-06-16 02:57:47
【问题描述】:

我将 OSGi 的 Felix 实现与 Maven 一起使用。我使用 maven bundle 插件来连接依赖项(即 Service-Component 标头)。我使用以下内容注册一个servlet

<Service-Component>
 com.mycompany.MyServlet;
 provide:=javax.servlet.http.HttpServlet;immediate:=true;
 http=org.osgi.service.http.HttpService
</Service-Component>

但是,我想使用相同的 HTTP 服务运行第二个 servlet。我怎样才能做到这一点?

【问题讨论】:

  • 呃,servlet 是按需创建的……您能重新表述一下您的问题吗?
  • 我并没有真正进入 Java 世界,这就是为什么我可能不知道如何表达我的必要性 :-) 我有 Felix、Maven 和 Jetty 一起玩。如何将 servlet 注册为依赖项? “按需”是什么意思?
  • “我如何将 servlet 注册为依赖项”
  • 我的意思是,我有两个不同的 servlet,它们应该处理两个不同路径的请求。但是,如果我尝试在 中注册第二个 servlet,Jetty 会尝试创建一个新的 HTTP 服务(正如我从日志中看到的那样)并且失败,因为已经有一个在 127.0.0.1 上监听
  • 这实际上更像是一种 osgi 主义,然后是与码头相关的任何事情......如何做到这一点在码头中简单明了,在 osgi 的世界中远不如此

标签: java maven servlets jetty osgi


【解决方案1】:

我建议将 felic SCR annotations 与 maven-scr-plugin 一起使用

然后您可以简单地注释您的 servets:

@Component(immediate=true)
@Service(Servlet.class)
@Property(name="alias", value="/path1")
public class Servlet1 extends HttpServlet {
    ...
}

@Component(immediate=true)
@Service(Servlet.class)
@Property(name="alias", value="/path2")
public class Servlet2 extends HttpServlet {
    ...
}

它还假设您安装了 Felix HTTP whiteboard 包。 HTTP 白板会检测所有 javax.servlet.Servlet 类型的服务,并自动将它们注册到 HTTP 服务中。

【讨论】:

    【解决方案2】:

    快速回答:简单,在 Service-Component 标头中添加更多子句:

     <Service-Component>
      com.mycompany.MyServlet1;
        provide:=javax.servlet.http.HttpServlet;immediate:=true;
        http=org.osgi.service.http.HttpService,
      com.mycompany.MyServlet2;
        provide:=javax.servlet.http.HttpServlet;immediate:=true;
        http=org.osgi.service.http.HttpService
     </Service-Component>
    

    更好的答案。 Apache Felix 有 White board bundle。此捆绑包在服务注册表中跟踪 Servlet 服务(不是 HttpServlet!但它确实跟踪过滤器服务),并自动将它们添加到当前的 Http 服务服务中。所以你所做的就是在 Servlet.class 下注册一个别名的“别名”属性。这也不需要您立即执行,使其在使用 servlet 之前变得懒惰。这在 42 的回答中被提倡,但在标题方法中看起来像这样:

     <Service-Component>
      com.mycompany.MyServlet1;
        provide:=javax.servlet.servlet.Servlet; 
        properties="alias=/path"
     </Service-Component>
    

    最佳答案,使用 OSGi DS 注释来注册您的 servlet:

     @Component(provide=Servlet.class, properties='alias=/path')
     public void MyServlet extends HttpServlet {
        public void doGet(HttpServletRequest rq, HttpServletResponse rsp) {
            ...
        }
     }
    

    【讨论】:

      猜你喜欢
      • 2015-05-25
      • 2017-01-04
      • 1970-01-01
      • 2017-08-28
      • 2013-11-02
      • 1970-01-01
      • 2012-09-17
      • 2014-08-08
      • 1970-01-01
      相关资源
      最近更新 更多