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

使用Apache Camel路由和ActiveMQ提供异步交付支持

林魁
2023-03-14

请帮助我完成使用Apache Camel和ActiveMQ的异步交付支持的体系结构,下面我已经逐个解释了我的需求。

>

  • 我有Jetty服务器接收传入消息,并有ActiveMQ使用Kaha DB将其存储在磁盘中。

    活动MQ将ack存储在kaha DB中后发送回客户端。

    我有Spring AbstractPollingMessageListenerContainer JMS消息监听器,它每隔1秒从activemq队列中获取消息,并分派到骆驼HTTPendpoint,然后最后发送到实际的远程接收器。一旦Dispatcher线程从远程接收器获得响应,它就会从ActiveMQ中删除消息。

    所以我现在的架构如下:

    Camel Jetty服务器---->ActiveMQ队列---->Dispatcher线程---->Camel Direct Endpoint---->Camel HTTP Endpoint-->remote receivers发回响应---->Response---->Dispatcher线程(发送ack以删除ActiveMQ队列中的消息)---->ActiveMQ队列。

    在这里,我觉得由于我们使用的是同步的直接endpoint,所以调度线程在得到响应之前一直保持活动状态,所以同一个调度线程无法处理来自ActiveMQ队列的新消息。

    请建议我是否可以在这里使用其他东西来避免直接endpoint。

    我使用了SEDAendpoint,但缺点是它使用1个线程处理1个消息,并且在得到接收方的响应之前会被阻塞。在这种方法中,以前的调度线程会被阻塞,而现在的Seda使用者线程会被阻塞,并且无法从Seda的内存队列中向远程接收器分派新消息。

    我感觉到某种设计可以帮助我继续向远程接收器发送消息,并且只有当响应返回时,一些守护进程线程才会得到通知,并且它将处理对ActiveMQ的确认。另外,我也想使用NIO框架实现,比如Camel Netty/Netty4-HTTP组件,但没有找到确切的用法以及如何将其适合于当前的体系结构。

    此外,新的想法是欢迎的,请给我的想法与一个限制,我必须坚持的消息和删除,只有在得到成功的响应后,从远程接收器。此外,我必须只使用Apache骆驼路由来设计架构。路线定义:1。调度员路线:从(弗罗穆里)到(图里斯);Fromuri:[ActiveMQueue.HTTP1270018081TestEndpoint1:Queue:ActiveMQueue?MaxConcurrentConsumers=15&ConcurrentConsumers=3&MaxMessageSpertask=10&MessageListenerContainerFactoryRef=AbstractPollingMessageListenerContainer]Touris:[ActiveMQ.dlq:Queue:ActiveMQ.dlq,Direction:HTTP1270018081TestEndpoint1]

    2.远程接收器代理路由:fromUri:direct:http1270018081testendpoint1 from(fromUri).To(toUri).process(responseProcessor)toUri:http://127.0.0.1:8081/testendpoint1?bridgeendpoint=true responseProcessor:To处理远程接收器接收到的响应。

    总体路由如下所示:Dispatcher路由---->Remote Receiver路由---->Remote Server

  • 共有1个答案

    咸高谊
    2023-03-14

    JMS消息确认是隐藏的,所以真正“将确认发送回队列”的唯一方法是使用JMS事务(不需要是XA)

    听起来像是LLR风格的事务将是有用的,并大大简化了您的事情。如果您使用JMS本地事务从队列中使用消息,并且只有一个其他endpoint,那么只有在http发送完成时消息才会被确认并从队列中删除--尽管http不支持事务。然后,您可以让多个并发使用者并行运行,并结合节流来帮助限制速率。

    from: amq:queue:INPUT.REQUESTS?.. concurrentConsumers.. and transacted enabled
    throttle
    to: http://url
    
     类似资料:
    • 英文原文: http://emberjs.com/guides/routing/asynchronous-routing/ 本节内容主要介绍一些路由的高级特性,以及路由是如何处理应用中的一些复杂异步逻辑的。 承诺简介 Ember在路由中处理异步逻辑的方案主要依赖于承诺(Promise)。简单地说,承诺就是代表了最后的值的对象。承诺可以被履行(成功的获得了最后的结果)也可以被拒绝(没有获得最后的结果

    • 我已经将Pay与Amazon与我的Web应用程序集成在一起,但我已经确定,只有在我执行代码调试时才能捕获资金,如果我没有断点,则不会发生。对我来说,这表明有必要暂停。我正在使用定期付款。相关代码部分如下: 因此,如果在捕获行的

    • 在支付完成后,从支付宝服务器请求我们的异步通知地址,这个才应该是做支付成功处理的时机。 // SDK实例化,传入公共配置 $sdk = new \Yurun\PaySDK\AlipayCrossBorder\SDK($params); class PayNotify extends \Yurun\PaySDK\AlipayCrossBorder\Online\Notify\Pay { /

    • Ember.js路由器能够使用异步路由处理应用程序中的复杂异步逻辑。 下面给出的表显示了路由器中处理异步逻辑的不同类型 - S.No. 异步路由器和描述 1 路由器暂停承诺 可以通过从模型钩子返回promise来暂停转换。 2 当Promises拒绝 如果在转换期间模型拒绝承诺,则将中止转换。 3 Recovering from Rejection 从中止的过渡中恢复。

    • 下面是我的app.js文件 下面是我的状态文件 我有一个模板,我想从那里导航到下一个状态 但是只要我点击这个锚标签,它就会把我导航回主页。(不去我打算去的州)。主要问题是URL(我猜)任何帮助都会很感激。

    • 问题内容: Angular在路由上不提供任何授权/访问权限(我说的是默认的Angular路由1.x,而不是beta 2.0或UI路由)。但是我必须执行它。 我遇到的问题是我有一项服务,该服务调用服务器以提供此信息并返回承诺。但是,此数据仅获取一次,然后缓存在客户端上,但是仍然需要获取一次。 我现在想处理检查下一条路由是否定义了特定属性的事件。然后,该处理程序应使用我前面提到的服务获取该数据,并根据