草庐IT

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

coder 2023-09-18 原文

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

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

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

这样的东西是行不通的..伪代码:

<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 的服务器建立新连接,该连接不存在,因为它是套接字客户端。而不是神奇地使用我想要的消费者打开的 channel 。这只是设置正确的 uri 选项的问题还是不可能?

这是问题的高级描述。以下是关于我的假设的更多详细信息,以及如果以上内容不够清楚我想要的内容。

据我了解,camel-netty 有一个 NettyConsumer,它创建一个将监听套接字的套接字服务器。此外,它还有一个 NettyProducer,它创建一个将写入套接字的套接字客户端。

我的问题是:我可以将 NettyConsumer 和 NettyProducer 配置为使用相同的套接字/ channel 吗?我假设,为了使这成为可能,netty 管道/ channel /或连接的某些组件知识需要在端点级别共享,因为它对消费者和生产者都是通用的。

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

我不太好的临时解决方案:

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

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

我用一个普通的套接字客户端测试了它并且可以工作。尽管这可行,但感觉有点像 hack,我更愿意配置一个 camel 生产者将响应发送回客户端。

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

提前致谢。

最佳答案

我想你想要的是这样的:

<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 通过您收到请求的套接字连接将交换主体发回。

关于sockets - 接收套接字请求,通过各种端点,并使用 camel 中的 netty 响应同一个套接字连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20575483/

有关sockets - 接收套接字请求,通过各种端点,并使用 camel 中的 netty 响应同一个套接字连接的更多相关文章

  1. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  2. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  3. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  4. ruby-on-rails - RSpec:避免使用允许接收的任何实例 - 2

    我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_

  5. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  6. ruby-on-rails - 如何使用 Rack 接收 JSON 对象 - 2

    我有一个非常简单的RubyRack服务器,例如:app=Proc.newdo|env|req=Rack::Request.new(env).paramspreq.inspect[200,{'Content-Type'=>'text/plain'},['Somebody']]endRack::Handler::Thin.run(app,:Port=>4001,:threaded=>true)每当我使用JSON对象向服务器发送POSTHTTP请求时:{"session":{"accountId":String,"callId":String,"from":Object,"headers":

  7. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  8. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  9. ruby - 是否可以在不实际发送或读取数据的情况下查明 ruby​​ 套接字是否处于 ESTABLISHED 或 CLOSE_WAIT 状态? - 2

    s=Socket.new(Socket::AF_INET,Socket::SOCK_STREAM,0)s.connect(Socket.pack_sockaddr_in('port','hostname'))ssl=OpenSSL::SSL::SSLSocket.new(s,sslcert)ssl.connect从这里开始,如果ssl连接和底层套接字仍然是ESTABLISHED,或者它是否在默认值7200之后进入CLOSE_WAIT,我想检查一个线程几秒钟甚至更糟的是在实际上不需要.write()或.read()的情况下关闭。是用select()、IO.select()还是其他方法完成

  10. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

随机推荐