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

Camel ApacheMQ->AHC行为(阻塞?)

宗政楚
2023-03-14

我刚开始使用Apache Camel,我对异步http客户机(AHC)的看似违反直觉的默认行为很好奇。在使用来自ActiveMQ的消息时,我无法让它以非阻塞的方式运行。

我的路线如下所示:

@Component
public class Broadcaster extends RouteBuilder {

  @Override
  public void configure() throws Exception {
    errorHandler(deadLetterChannel("activemq:failed.messages"));

    from("activemq:outbound.messages")
    .setExchangePattern(ExchangePattern.InOnly)
    .recipientList(simple("ahc:${in.header[PublishDestination]}"))
    .end();
  }
}

我将几条消息排队,其中一半发送到延迟的web服务器,另一半发送到正常的web服务器。我希望看到快速服务器立即消耗所有正常的消息,而缓慢的消息随着时间的推移逐渐消耗。但是,这是在快速web服务器上观察到的行为:

00:24:02.585, <hello>World</hello>
00:24:03.622, <hello>World</hello>
00:24:04.640, <hello>World</hello>
00:24:05.658, <hello>World</hello>

正如您所看到的,每个记录的请求之间正好有一秒钟,这与慢速服务器上人为的1秒延迟相对应。根据路由定时,JMS使用者在使用队列中的下一条消息之前,似乎正在等待AHC完成:

Processor                                 Elapsed (ms)
[activemq://outbound.messages           ] [      1020]
[setExchangePattern[InOnly]             ] [         0]
[ahc:${in.header[PublishDestination]}}  ] [      1018]

在这些情况下,我应该显式地使用异步生成器并编写回调处理程序吗?还是我还遗漏了什么?谢谢!

共有1个答案

长孙谦
2023-03-14

嗯,我想是RTFM的例子,尽管我ActiveMQ页面在endpoint配置可用的属性方面还有很多不足之处。可能应该有一张纸条来说大部分(全部?)ActiveMQ组件也可以使用JMS配置选项。在任何情况下,解决方案都是如下定义消费者:

from("activemq:outbound.messages?asyncConsumer=true")
 类似资料:
  • 问题内容: 我有这段代码可以在Linux中从Serial读取,但是我不知道在读取SerialPort时阻塞和非阻塞之间有什么区别,在哪种情况下哪个更好? 问题答案: 您提到的代码是IMO编码和注释不当的代码。该代码不符合POSIX的可移植性惯例,如正确设置终端模式和POSIX操作系统的串行编程指南中所述。该代码没有提到它使用非规范(也称为原始)模式,并且重用了“阻塞”和“非阻塞”术语来描述 VMI

  • 问题内容: 我正在为密集型网络应用程序实现无锁的单一生产者单一使用者队列。我有一堆工作线程在各自独立的队列中接收工作,然后它们将出队并进行处理。 从这些队列中删除锁可以极大地提高高负载下的性能, 但是当队列为空时它们不再阻塞 ,从而导致CPU使用率猛增。 我如何有效地使线程阻塞,直到它可以成功出队或被杀死/中断? 问题答案: 如果您使用的是Linux,请考虑使用Futex。它通过使用原子操作而不是

  • 在完美的世界,将没有战争或饥饿,所有 Api 将使用异步写,阳光明媚,绿色的草地有跳来跳去的兔子和手牵手的小羊羔。 但是,现实世界并不是这样。(你看过新闻最近吗?) 事实是,大多数库,特别是在JVM的生态,Y有许多是同步API,许多的方法有可能阻塞。一个很好的例子是JDBC API - 这是本质上的同步,不管如何努力尝试,Vert.x 不能撒上魔法使之同步。 我们不打算在一夜之间把一切改写成异步,

  • 我们目前正在使用Apache Camel作为集成框架设置一个Springboot项目。 在路由的最后,我们需要使用WSS websocket协议发送消息,其中我们的应用程序充当客户机,需要将消息发送到公开websocketendpoint的远程服务器。 但是远程服务器首先需要在WSS握手期间进行身份验证。事实上,它需要一些特定的HTTP头,包括头。只有在握手过程中才需要该令牌。打开websocke

  • 问题内容: 注意:这不是有关settimeout的复制文章,此处的关键答案是浏览器设计选项。 我开始研究node.js:一个测试异步的简单示例: 一件有趣的事情是,在带有curl的lind命令和浏览器中,它的行为是不同的:在Ubuntu 12.10中,我在两个控制台中使用curl localhost:8080,它们在几乎相同的10个发送中进行响应。 但是,我打开了两个浏览器,几乎同时发出了请求,但

  • 本文向大家介绍了解节点中代码执行的阻塞和解除阻塞,包括了了解节点中代码执行的阻塞和解除阻塞的使用技巧和注意事项,需要的朋友参考一下 现在,我们在fs模块中具有文件写入功能writeFileSync,如下所示- 同步表示已同步。这是一个阻塞代码示例。一旦文件写入完成,则仅对其余文件执行代码。上面的代码比较简单,但是如果我们进行大量的文件处理操作,将会导致应用性能下降。 这种代码执行方式将减慢其他请求