我为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
。
答案 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没有在任何地方看到过这种情况。