1

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

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

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

在尝试实现这样的事情时,我想将每个 API 系统放在它自己的 OSGi 包中,并使用 Camel 和 Jetty 来处理传入的 API 请求,每个系统将在 jetty 基本 URL 下注册一个路径并接收发往它的消息来自骆驼路由机制。我在这个设计中遇到了麻烦,因为如果我在每个包中配置一个路由,它们在单独CamelContext的 s 中运行,所以第一个包运行,但第二个包尝试在同一端口上生成另一个 Jetty 服务器,但失败了。

然后,我创建了一个 OSGi 服务,该服务将采用 aRouteBuilder并将其添加到现有的“主” CamelContext( suspend, addRoutes, resume) 中。这不起作用,因为主CamelContext服务器在单独的 API 包中看不到服务/进程。它也不允许基于 XML 的配置。

我对解决问题的不同方法持开放态度。

4

4 回答 4

1

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

于 2012-11-19T07:20:39.983 回答
0

啊,是的,我想有点棘手。

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

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

<!-- osgi references goes here -->

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

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

也许我们可以通过某种方式将<routeContext>自己注册为 OSGi 服务。我们这样做是为了<camelContext>。

于 2012-11-18T11:52:51.253 回答
0

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

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

于 2012-11-19T08:58:56.967 回答
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">
...

哪个配置会生效?

于 2012-12-04T04:13:32.160 回答