基于单独的OSGi包生成动态Camel路由

时间:2012-11-18 09:12:17

标签: jetty osgi apache-camel

简短版本 有没有办法让多个Camel路由在单独的OSGi包中定义(带有支持进程)共享/合并到一个CamelContext中,这样一个Jetty服务器就可以将传入的请求路由到单独的包中?

背景 这是一个假设的要求,因为真正的要求是保密的......

我正在为网站构建模块化API后端,第一阶段实现简单的客户注册,第二阶段将实现类似论坛的系统,第三阶段将实现类似wiki的系统。当每个系统完成开发时,我需要能够将新系统添加到API后端,而无需修改其他组件或(理想情况下)使系统脱机。

在尝试实现这样的东西时,我想到让每个API系统都有自己的OSGi包,并使用Camel和Jetty来表示传入的API请求,每个系统都会在jetty基本URL下注册一个路径并接收消息从Camel路由机制注定它。我遇到了这个设计的麻烦,因为如果我在每个捆绑包中配置路由,它们在单独的CamelContext中运行,所以第一个捆绑包运行,但第二个捆绑包尝试在同一个端口上生成另一个Jetty服务器,并失败。

然后,我创建一个OSGi服务,该服务将RouteBuilder并将其添加到现有的“主”CamelContextsuspendaddRoutes,{{1 }})。这不起作用,因为主resume未在单独的API包中看到服务/进程。它也不允许基于XML的配置。

我愿意采用不同的方法解决问题。

4 个答案:

答案 0 :(得分:1)

只需使用servlet组件而不是jetty组件。它可以使用OSGi HTTPService注册servlet。然后所有servlet路由都使用此servlet并可以注册自己的子路径。这适用于捆绑包,应该可以解决您的问题。

答案 1 :(得分:0)

啊,我觉得有点棘手。

在您的客户端软件包中,我假设您可以使用OSGi服务注册表来导出具有路由的RouteBuilder类的服务。

例如,使用蓝图xml文件,您可以将这些路径构建器导出为OSGi服务。然后在具有Camel上下文的包中,您可以引用这些服务,然后您可以从CamelContext引用

<!-- osgi references goes here -->

<camelContext ...>
  <routeBulderRef ref="myClientRoute"/>
  <routeBulderRef ref="myOtherClientRoute"/>
   ...
</camelContext>

如果您想将XML DSL用于客户端路由,那么这可能会有点棘手。您可以在蓝图XML文件中使用<routeContext id="myClientRoute">。虽然如何将其作为OSGi服务导出可能会很棘手。

也许我们可以某种方式将<routeContext>注册为OSGi服务。我们为<camelContext&gt;。

执行此操作

答案 2 :(得分:0)

啊,是的,如果你使用相同的端口号,在OSGi中Jetty服务器在Camel捆绑包之间共享。这允许您在单独的包中安装新的Camel路由,并让它们各自拥有自己的生命周期,因此您可以根据需要安装/卸载包。

是的,因为Christian也说你可以使用camel-servlet代替。然后它使用OSGi HTTP服务。 Apache ServiceMix / Karaf使用Jetty作为servlet容器实现。您可以在ServiceMix / Karaf的etc目录中的配置文件中配置其jetty配置。

答案 3 :(得分:0)

使用相同的端口号。

这提出了另一个问题:

如果共享码头,我们如何控制最小/最大线程。

示例:

在routeA.xml中:

<from uri="jetty:http://0.0.0.0:9191/proxy/serviceA/?maxThread=20">
...

在routeB.xml中:

<from uri="jetty:http://0.0.0.0:9191/proxy/serviceB/?maxThread=50">
...

哪种配置有效?