【发布时间】:2017-11-10 04:35:47
【问题描述】:
我有一个JmsConnectionFactory 配置了这样的 URI:
failover:(amqps://11.22.33.44?amqp.idleTimeout=120000&transport.tcpKeepAlive=true&jms.prefetchPolicy.all=10)?failover.maxReconnectAttempts=20
注意jms.prefetchPolicy.all=10参数,根据官方documentation
... 控制远程对等点可以发送多少条消息 发送到客户端并保存在每个消费者的预取缓冲区中 实例。
所以我不应该看到客户端中缓冲的消息超过 10 条,对吧?好吧,那行不通。
我最终使用反射来定期打印每个JmsMessageConsumer 的MessageQueue.size():
MessageConsumer messageConsumer = ...
Field field = JmsMessageConsumer.class.getDeclaredField("messageQueue");
field.setAccessible(true);
MessageQueue q = (MessageQueue) field.get(messageConsumer);
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(() -> System.out.println(q.size()), 10, 10, TimeUnit.SECONDS);
当我的消息处理程序很慢(或阻塞)时,我看到队列大小略小于 1000 条消息,这是默认的预取大小。
那么 - 这是一个错误吗?我该如何设置不同的预取大小?
我正在使用qpid-jms-client,版本0.27.0。
【问题讨论】:
标签: java jms amqp azureservicebus qpid