【问题标题】:Apache QPID JMS Client - setting prefetch doesn't workApache QPID JMS 客户端 - 设置预取不起作用
【发布时间】: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


    【解决方案1】:

    想通了。

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

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

    在任何地方都没有看到这方面的记录。

    【讨论】:

      【解决方案2】:

      你的 URI 不正确,应该是:

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

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

      【讨论】:

      • 啊,这就解释了。我稍后会试试看。
      猜你喜欢
      • 2016-11-26
      • 2021-01-04
      • 2013-02-05
      • 2014-08-04
      • 2013-07-19
      • 2014-12-23
      • 2015-11-27
      • 2015-04-04
      • 1970-01-01
      相关资源
      最近更新 更多