“对于队列,maxbytes定义了队列可以存储的最大大小(以字节为单位),对队列中的所有消息求和。如果超过此限制,消息将被服务器拒绝,消息生产者发送调用将返回错误。”
目前,我们的一个队列将maxbytes设置为500000000,但待处理的消息大小要高得多,为2.5GB
这怎么可能?
谢谢!
“对于队列,maxbytes定义了队列可以存储的最大大小(以字节为单位),对队列中的所有消息求和。如果超过此限制,消息将被服务器拒绝,消息生产者发送调用将返回错误。”
目前,我们的一个队列将maxbytes设置为500000000,但待处理的消息大小要高得多,为2.5GB
这怎么可能?
谢谢!
一种可能的解释是该maxbytes
属性仅与未传递的挂起消息有关。maxbytes
这意味着在计算属性时不考虑已传递但尚未被 JMS 使用者确认的消息。
当您show queue <queue_name>
使用 EMS 管理工具时,它的Delivered Msgs
价值是不是特别高?
Nicolas Heitz 所说的似乎是正确的。
我在本地运行了一个简单的测试来重现这一点,使用 TIBCO Designer 发送和接收大小约为 4Mb 的大型消息,并且将队列配置为 maxbytes 设置为 100Kb,
这是测试开始前队列的样子:
可以向队列发送一条 4MB 的消息,但之后的任何消息都失败了。
起点,队列上有一条 4MB 的待处理消息
发送第二条消息有效
似乎可以继续发送消息,只要队列中有一个活动的接收者正在处理消息而尚未确认它们。
如果一个缓慢的消费者没有足够快地确认它接收到的消息,maxbytes将不会限制队列中待处理的 msgs 大小。
如果队列中没有消费者,则在发送消息之前会检查maxbytes,如果达到限制,则消息生产者将收到来自 ems 服务器的错误消息,无法发送新消息。
maxbytes属性不会阻止将大于 maxbytes 的消息发送到队列。