如何使用camel-jetty和camel-websocket组件在同一端口上侦听不同的URI?

时间:2014-08-26 14:48:16

标签: websocket jetty apache-camel

camel-websocket组件使用Jetty使用如下的URI创建Web套接字服务器:

websocket://localhost:2080/replication

但我还想使用camel-jetty组件来监听HTTP请求:

jetty://http://localhost:2080/rest/

当我尝试在Camel中配置它时,我得到:

java.net.BindException: Address already in use

如何配置路由以便Jetty可以同时执行这两项操作?

1 个答案:

答案 0 :(得分:2)

如果您使用的是基本路线配置,则不能。

camel-websocket组件创建自己的内部Jetty服务器,该服务器侦听您在websocket URI中指定的端口。查看WebsocketComponent的source,特别是在createServer()方法中。

同样,如果你查看camel-jetty组件的source,你会发现camel-jetty组件也创建了一个Jetty服务器。因此,当您在同一端口上使用两个Camel组件时,它们会以您记录的方式爆炸。

这两个组件都没有为您提供传递对现有Jetty Server实例的引用的能力,这意味着您无法进行某种解决方法。

最直接的选择是在Java应用程序前面使用最新版本的Apache作为反向代理,并让两个不同的Camel路由在不同的端口上侦听,Apache监听单个端口并将请求转发给基于URL的适当组件。 Hacky,但非常实用。

Apache mod_proxy_wstunnel

Apache mod_proxy

更加劳动密集的选择是编写WebSocket处理程序,并在camel-jetty组件上注册它。自定义处理程序的注册在Jetty的documentation中标题为“Jetty处理程序和安全性配置”中。然后,您可以使用Camel的bean绑定将消息路由到处理程序。这将在相同的IP和端口上实现WebSocket和REST的目标,代价是重新发明驼峰 - websocket轮。