第 19 章 流控制
流程控制可用于限制客户端和服务器之间的消息传递数据流,从而使消息传递参与者不会感到不堪重负。您可以从消费方和制作者一侧管理数据流。
19.1. 消费者流控制 复制链接链接已复制到粘贴板!
JBoss EAP 消息传递包括的配置,用于定义预先为使用者获取的数据量,以及控制使用者能够使用消息的速度。
基于窗口的流控制
JBoss EAP 消息预先填充到每位消费者的缓冲区中。缓冲区的大小由 connection- factory 属性决定。以下示例配置显示了一个明确设置了 的 consumer-window- sizeconsumer- 。
window-size 属性的 connection- factory
<connection-factory name="MyConnFactory" ... consumer-window-size="1048576" />
<connection-factory name="MyConnFactory" ... consumer-window-size="1048576" />
使用管理 CLI,读取和写入给定 connection 属性的值。以下示例演示了如何使用 -factory 的 consumer-window- sizeInVmConnectionFactory 连接工厂完成此操作,对于驻留在同一虚拟机(例如本地 MessageDrivenBean )的消费者而言,这是默认设置。
-
从管理 CLI 阅读
InVmConnectionFactory的consumer-window-size属性
/subsystem=messaging-activemq/server=default/connection-factory=InVmConnectionFactory:read-attribute(name=consumer-window-size)
{
"outcome" => "success",
"result" => 1048576
}
/subsystem=messaging-activemq/server=default/connection-factory=InVmConnectionFactory:read-attribute(name=consumer-window-size)
{
"outcome" => "success",
"result" => 1048576
}
-
从管理 CLI 编写
consumer-window-size属性
/subsystem=messaging-activemq/server=default/connection-factory=InVmConnectionFactory:write-attribute(name=consumer-window-size,value=1048576)
{"outcome" => "success"}
/subsystem=messaging-activemq/server=default/connection-factory=InVmConnectionFactory:write-attribute(name=consumer-window-size,value=1048576)
{"outcome" => "success"}
consumer-window-size 的值必须是整数。下表中指出一些值具有特殊含义。
| 值 | 描述 |
|---|---|
| n |
用于将缓冲区大小设置为 |
| 0 | 关闭缓冲区。这有助于适应较慢的消费者,并能跨多个消费者确定分布情况。 |
| -1 | 创建未绑定缓冲区。这有助于非常快速的消费者在收到消息时尽快调取和处理消息。 |
如果使用者无法在接收消息时尽快处理消息,则将 consumer-window-size 设置为 -1 可溢出客户端内存。
如果您使用核心 API,则使用者窗口大小可以使用其 setConsumerWindowSize() 方法从 ServerLocator 设置。
如果您使用 JMS,客户端可以使用实例化 ConnectionFactory 的 setConsumerWindowSize() 方法指定使用者窗口大小。
速率限制流控制
JBoss EAP 消息传递可以规范每秒使用的消息速率,这种流控制方法称为节流。使用适当 属性,确保使用者不会以比指定的速度更快地使用消息。
connection-factory 的 consumer-max- rate
<connection-factory name="MyConnFactory" ... consumer-max-rate="10" />
<connection-factory name="MyConnFactory" ... consumer-max-rate="10" />
默认值为 -1,它会 禁用速率限制流控制。
管理 CLI 是读取和写入 consumer-max-rate 属性的建议方法。以下示例演示了如何使用 InVmConnectionFactory 连接工厂完成此操作,这对于驻留在同一虚拟机(例如本地 MessageDrivenBean )的消费者而言是默认设置。
-
使用管理 CLI 读取
consumer-max-rate属性
/subsystem=messaging-activemq/server=default/connection-factory=InVmConnectionFactory:read-attribute(name=consumer-max-rate)
{
"outcome" => "success",
"result" => -1
}
/subsystem=messaging-activemq/server=default/connection-factory=InVmConnectionFactory:read-attribute(name=consumer-max-rate)
{
"outcome" => "success",
"result" => -1
}
-
使用管理 CLI 编写
consumer-max-rate属性:
/subsystem=messaging-activemq/server=default/connection-factory=InVmConnectionFactory:write-attribute(name=consumer-max-rate,value=100)
{"outcome" => "success"}
/subsystem=messaging-activemq/server=default/connection-factory=InVmConnectionFactory:write-attribute(name=consumer-max-rate,value=100)
{"outcome" => "success"}
如果使用 JMS,可使用实例化 ConnectionFactory 的 setConsumerMaxRate(int consumerMaxRate)方法设置最大速率大小。
如果您使用 Core API,可使用 ServerLocator.setConsumerMaxRate(int consumerMaxRate) 方法设置速率。