当前位置: 首页 > 知识库问答 >
问题:

接收套接字请求,通过各种endpoint,并在骆驼中使用netty响应相同的套接字连接

陶元凯
2023-03-14

我目前正在自定义camel组件中使用netty监听套接字(使用具有netty通道处理程序的使用者),将消息从套接字传递到多个camelendpoint,并最终将最终结果写入平面文件。

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

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

像这样的东西不工作...伪代码:

<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有一个Netty消费者,它创建了一个套接字服务器,该服务器将监听套接字。此外,它还有一个NettyProducer,用于创建将写入套接字的套接字客户端。

我的问题是:我可以将NettyConsumer和NettyProducer配置为使用相同的套接字/通道吗?我认为,为了实现这一点,需要在endpoint级别共享网络管道/通道/或一些可了解连接的组件,因为这对消费者和生产者都是公共的。

我已经阅读了有关同步请求-响应的文档,但我认为这只适用于使用exchange主体并通过exchange将其发送回的单个处理器。

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

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

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

我用一个普通的套接字客户端测试了这个。尽管这是可行的,但感觉有点像黑客攻击,我更愿意配置骆驼生产者将响应发送回客户端。

在这一点上,我需要知道我是否能做到这一点,或者我是否需要为自己写一些更个性化的东西。唯一的要求是camel和socket io,如果netty做不到这一点,其他东西也可以,那也会有帮助。

提前感谢。

共有1个答案

佘辰龙
2023-03-14

我想你想要的是这样的:

<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>

有了内容丰富器,您应该能够通过任意数量的endpoint路由交换,并让Camel通过接收请求的套接字连接将交换主体发回。

 类似资料:
  • 问题内容: 我已经用套接字卡住了4h,我使用的方式是只有一个应用程序作为客户端和服务器,一旦客户端连接, 它将与新客户端一起打开theard,并等待消息。 一旦消息发送到服务器,客户端将收到响应,该部分正在正常工作。 客户专区的一部分: 服务器支持2条消息,第一条是“列表”,发送一条命令是“获取值”。 如果客户端将请求命令“列表”,它将运行以下命令:有一个“服务器/客户端”,它正在发送请求并接收一

  • 请帮我找出问题所在。我太过分了,请帮我解决这个问题

  • socket_read和socket_recv之间有什么区别?我正在尝试使用PHP套接字,但使用socket_read时收到了以下警告: 请帮帮我!

  • 问题内容: 我试图理解SocketChannels和NIO。我知道如何使用常规套接字,以及如何制作一个简单的每客户端线程服务器(使用常规阻塞套接字)。 所以我的问题是: 什么是SocketChannel? 当使用SocketChannel而不是Socket时,我还能得到什么呢? 通道和缓冲区之间是什么关系? 什么是选择器? 文档中的第一句话是。那是什么意思? 我也阅读了本文档,但是不知何故…… 问

  • 问题内容: 我正在尝试使用Socket处理Java中的简单POST请求。我可以接收请求标头并毫无问题地回答请求,但是我当然无法获取请求的正文。 我读过某个地方,我需要打开第二个InputStream来达到这个目的,但这对我来说真的没有意义。您对如何获取请求正文有任何建议吗? 这是我基本上用来获取标头的内容: 因此,我收到的消息是这样的: 但是我无法获取POST请求的参数。 编辑: 因此事实证明,我

  • 问题内容: 如何创建SSL套接字连接? 我真的需要创建密钥库吗?该密钥库应该与我所有的客户端应用程序共享吗? 我用以下代码创建了一个服务器: 我用以下代码在android上创建了一个客户端: 但是当我尝试连接时,会引发以下错误: 问题答案: 您需要一个证书来建立ssl连接,您可以在密钥库中加载证书,也可以加载证书本身。我将显示一些有关keystore选项的示例。 您的代码需要一些参数才能运行: 您