Apache QPID JMS客户端 - 设置预取不起作用

时间:2017-11-09 16:56:55

标签: java jms amqp azureservicebus qpid

我为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条消息,对吧?嗯,这不起作用。

我最终使用反射来定期打印每个MessageQueue.size()的{​​{1}}:

JmsMessageConsumer

当我的消息处理程序缓慢(或阻塞)时,我看到队列大小略小于1000条消息,这是默认的预取大小。

所以 - 这是一个错误吗?我该如何设置不同的预取大小?

我使用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); ,版本qpid-jms-client

2 个答案:

答案 0 :(得分:1)

您的URI不正确,应该是:

failover://(amqps://11.22.33.44?amqp.idleTimeout=120000&transport.tcpKeepAlive=true)
    ?jms.prefetchPolicy.all=10&failover.maxReconnectAttempts=20

JMS选项是全局的,因此它们与故障转移选项一起应用于URI的最外层部分。包装的AMQP连接URI仅包含控制每个特定连接的传输选项。

答案 1 :(得分:0)

想出来。

JmsConnectionFactory有一个JmsPrefetchPolicy。我不知道应该如何使用URI参数进行设置,但可以使用JmsConnectionFactory.setPrefetchPolicy()进行设置,如下所示:

JmsConnectionFactory cf = ...
JmsDefaultPrefetchPolicy prefetchPolicy = new JmsDefaultPrefetchPolicy();
prefetchPolicy.setAll(123); // Set prefetch size here
cf.setPrefetchPolicy(prefetchPolicy);

Haven没有在任何地方看到过这种情况。