19.2. 制作者流控制


JBoss EAP 消息传递还可以限制从客户端发送的数据量,以防止服务器接收过多的消息。

基于窗口的流控制

JBoss EAP 消息传递利用信用交换规范消息制作者。只要有足够的学分,生产者就可以发送消息到地址。发送邮件所需的信用金额由邮件大小决定。由于生产者的学分较低,他们必须从服务器请求更多。在服务器配置中,生产者一次请求的信用量称为 producer-window-size,这是 connection-factory 元素的属性:

<connection-factory name="MyConnFactory" ... producer-window-size="1048576" />
Copy to Clipboard Toggle word wrap

窗口大小决定了任意时间可以内亮的字节数量,从而防止远程连接过载服务器。

使用管理 CLI 读取和写入给定连接工厂的 producer-window-size 属性。以下示例使用 RemoteConnectionFactory,它包含在默认配置中并供远程客户端使用。

  • 使用管理 CLI 读取 producer-window-size 属性:
subsystem=messaging-activemq/server=default/connection-factory=RemoteConnectionFactory:read-attribute(name=producer-window-size)
{
    "outcome" => "success",
    "result" => 65536
}
Copy to Clipboard Toggle word wrap
  • 使用管理 CLI 编写 producer-window-size 属性:
/subsystem=messaging-activemq/server=default/connection-factory=RemoteConnectionFactory:write-attribute(name=producer-window-size,value=65536)
{"outcome" => "success"}
Copy to Clipboard Toggle word wrap

如果您使用 JMS,客户端可以调用 ConnectionFactorysetProducerWindowSize(int producerWindowSize) 方法来直接设置窗口大小。

如果使用 core API,可以使用 ServerLocatorsetProducerWindowSize(int producerWindowSize) 方法设置窗口大小。

阻塞基于 Producer Window 的流控制

通常,消息传递服务器始终提供与请求相同的分数。但是,可以限制服务器发送的信用量,这可以防止因为生产者发送超过一次可处理的消息而耗尽内存。

例如,如果您有一个名为 myqueue 的 JMS 队列,并且您将最大内存大小设置为 10MB,服务器将规定队列中的消息数量,使其大小永不会超过 10MB。当地址变满时,生产者将在客户端阻止,直到地址上有足够的空间可用。

注意

阻止制作者流控制是分页的一种替代方法,它不会阻止生产者,而是将信息页到存储。如需更多信息,请参阅关于分页

address-setting 配置元素包含用于管理阻止制作者流控制的配置。address-setting 用于将一组配置应用到该地址注册的所有队列。有关如何进行此操作的更多信息,请参阅配置地址设置

对于需要阻止制作者流控制的每个 address-setting,您必须包含 max-size-bytes 属性的值。绑定到该地址的所有队列的总内存不能超过 max-size-bytes。如果是 JMS 主题,这意味着主题中所有订阅的总内存不能超过 max-size-bytes

您还必须将 address-full-policy 属性设置为 BLOCK,以便服务器知道如果达到 max-size-bytes, 则应阻止制作者。以下是设置了这两个属性 的 address-setting 示例:

<address-setting ...
      name="myqueue"
      address-full-policy="BLOCK"
      max-size-bytes="100000" />
Copy to Clipboard Toggle word wrap

上例会将 JMS 队列"myqueue"的最大大小设置为 100000 字节。达到最大大小后,生产者将被阻止发送到该地址。

使用管理 CLI 设置这些属性,如下例所示:

  • 为指定 address -setting 设置 max-size- bytes
/subsystem=messaging-activemq/server=default/address-setting=myqueue:write-attribute(name=max-size-bytes,value=100000)
{"outcome" => "success"}
Copy to Clipboard Toggle word wrap
  • 为指定的 address- setting 设置 address-full-policy
/subsystem=messaging-activemq/server=default/address-setting=myqueue:write-attribute(name=address-full-policy,value=BLOCK)
{"outcome" => "success"}
Copy to Clipboard Toggle word wrap

速率限制流控制

如果您为它所使用的 connection-factory 指定制作者/最大值,请限制生产者 每秒可发送的消息数量,如下例所示:

<connection-factory name="MyConnFactory" producer-max-rate="1000" />
Copy to Clipboard Toggle word wrap

默认值为 -1,它会 禁用速率限制流控制。

使用管理 CLI 读取和写入 producer-max-rate 的值。以下示例使用 RemoteConnectionFactory,它包含在默认配置中并供远程客户端使用。

  • 阅读 producer-max-rate 属性的值:
/subsystem=messaging-activemq/server=default/connection-factory=RemoteConnectionFactory:read-attribute(name=producer-max-rate)
{
    "outcome" => "success",
    "result" => -1
}
Copy to Clipboard Toggle word wrap
  • 编写 producer-max-rate 属性的值:
/subsystem=messaging-activemq/server=default/connection-factory=RemoteConnectionFactory:write-attribute(name=producer-max-rate,value=100)
{"outcome" => "success"}
Copy to Clipboard Toggle word wrap

如果使用 core API,请使用方法 ServerLocator.setProducerMaxRate(int producerMaxRate) 来设置速率。

如果您使用 JNDI 来实例化和查找连接工厂,则可以使用实例化连接工厂的 setProducerMaxRate(int producerMaxRate) 方法在客户端上设置最大速率。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat