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