简短版本
有没有办法让多个Camel路由在单独的OSGi包中定义(带有支持进程)共享/合并到一个CamelContext
中,这样一个Jetty服务器就可以将传入的请求路由到单独的包中?
背景 这是一个假设的要求,因为真正的要求是保密的......
我正在为网站构建模块化API后端,第一阶段实现简单的客户注册,第二阶段将实现类似论坛的系统,第三阶段将实现类似wiki的系统。当每个系统完成开发时,我需要能够将新系统添加到API后端,而无需修改其他组件或(理想情况下)使系统脱机。
在尝试实现这样的东西时,我想到让每个API系统都有自己的OSGi包,并使用Camel和Jetty来表示传入的API请求,每个系统都会在jetty基本URL下注册一个路径并接收消息从Camel路由机制注定它。我遇到了这个设计的麻烦,因为如果我在每个捆绑包中配置路由,它们在单独的CamelContext
中运行,所以第一个捆绑包运行,但第二个捆绑包尝试在同一个端口上生成另一个Jetty服务器,并失败。
然后,我创建一个OSGi服务,该服务将RouteBuilder
并将其添加到现有的“主”CamelContext
(suspend
,addRoutes
,{{1 }})。这不起作用,因为主resume
未在单独的API包中看到服务/进程。它也不允许基于XML的配置。
我愿意采用不同的方法解决问题。
答案 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">
...
哪种配置有效?