接收套接字请求,通过各种端点,并使用camel中的netty响应同一套接字连接

时间:2013-12-13 20:32:08

标签: sockets tcp apache-camel netty

我目前在自定义camel组件中使用netty来侦听套接字(使用带有netty通道处理程序的使用者),将消息从套接字传递给多个camel端点,最终将结果写入平面文件中。 / p>

这很好用,但显然仅限于“仅限于”功能。

我想做的是,不是将最终结果写入平面文件,而是通过套接字将最终结果发送回请求者。

这样的东西不起作用..伪代码:

<route>
  <from:netty:tcp://localhost:1111/>
  <to:endpoint1/>
</route>
<route>
  <from:endpoint1 />
  <to:netty:tcp://localhost:1111 />
</route>

我怀疑发生的是我使用

<to:netty:tcp://localhost:1111 /> 

导致NettyProducer尝试在localhost:1111上建立与服务器的新连接,因为它是套接字客户端,所以它不存在。而不是神奇地使用我想要的消费者打开的渠道。这只是设置正确的uri选项的问题还是不可能?

这是问题的高级描述。以下是关于我的假设的更多细节以及如果上述内容不够明确我想要的内容。

据我所知,camel-netty有一个NettyConsumer,可以创建一个侦听套接字的套接字服务器。此外,它还有一个NettyProducer,用于创建将写入套接字的套接字客户端。

我的问题是:我可以配置NettyConsumer和NettyProducer使用相同的套接字/通道吗?我假设为了使这成为可能,netty管道/通道/或一些知道连接的组件需要在端点级别上共享,因为它对于Consumer和Producer都是通用的。

我已经阅读了有关同步请求 - 响应的文档,但我相信这只适用于您使用单个处理器消耗交换机构并通过交换机将其发回的情况。

我不是那么好的临时解决方案:

所以我实际上有这个工作,但我不喜欢它。这是我做的:

  • 创建/扩展简单地阻止/轮询目标文件的SimpleChannelHandler
  • 将此处理程序添加为服务器管道中的最后一个处理程序
  • 一旦我的其他端点进程完成并创建了文件,轮询处理程序将提取文件的内容并将内容写入下游并关闭通道。
  • 响应最终返回到原始套接字客户端。

我使用普通套接字客户端测试了这个并且正常工作。即使这有效,但感觉有点像黑客,我宁愿配置一个骆驼制作人将响应发送回客户端。

此时,我需要知道我是否可以这样做,或者我是否需要为自己编写更多自定义内容。唯一的要求是驼峰和插座io,如果netty无法做到这一点,而其他东西可以,那也会有所帮助。

提前致谢。

1 个答案:

答案 0 :(得分:1)

我认为你想要的是这样的:

<camel:route id="rest.route.request.search">
    <from:netty:tcp://localhost:1111/>
    <!-- Send exchange off to another endpoint for enrichment/processing -->
    <camel:enrich ref="some.endpoint.ref" />
    <!-- Exchange body is sent back to caller -->
</camel:route>

使用content enricher,您应该能够通过任意数量的端点路由交换,并让Camel通过您收到请求的套接字连接发回交换体。