Jms maxbyte属性应该如何工作?

Jms maxbyte属性应该如何工作?,jms,tibco,tibco-ems,Jms,Tibco,Tibco Ems,根据 “对于队列,maxbytes定义队列可以使用的最大大小(以字节为单位) 存储,对队列中的所有消息求和。如果超过此限制, 服务器将拒绝消息,消息生产者将发送呼叫 返回一个错误。“ 目前,我们的一个队列已将maxbytes设置为500000000,但挂起的MSG大小要高得多,2.5GB 这怎么可能呢 谢谢 一种可能的解释是,maxbytes属性仅适用于未送达的挂起的消息。这意味着在计算maxbytes属性时,不会考虑JMS使用者已经传递但尚未确认的消息 当您使用EMS管理工具发出show qu

根据

“对于队列,maxbytes定义队列可以使用的最大大小(以字节为单位) 存储,对队列中的所有消息求和。如果超过此限制, 服务器将拒绝消息,消息生产者将发送呼叫 返回一个错误。“

目前,我们的一个队列已将maxbytes设置为500000000,但挂起的MSG大小要高得多,2.5GB

这怎么可能呢


谢谢

一种可能的解释是,
maxbytes
属性仅适用于未送达的挂起的消息。这意味着在计算
maxbytes
属性时,不会考虑JMS使用者已经传递但尚未确认的消息


当您使用EMS管理工具发出
show queue
时,
Delivered Msgs
值是否显得特别高?

Nicolas Heitz所说的似乎是正确的

我在本地运行了一个简单的测试来重现这一点,使用TIBCO Designer发送和接收大小约为4Mb的大型消息,队列配置为maxbytes设置为100Kb

这是测试开始前队列的样子:

第一种情况是,队列上没有接收者。 可以向队列发送一条4MB消息,但此后的任何消息都会失败

第二种情况,一个接收器不确认消息 起点,队列上的一条4MB挂起消息

发送第二条消息有效

只要队列上有一个活动的接收者在处理消息时还没有确认消息,就可以继续发送消息

结论 如果较慢的使用者没有足够快地确认其接收到的消息,maxbytes将不会限制队列上的挂起的msgs大小

如果队列中没有使用者,则在发送消息之前将检查maxbytes,如果达到限制,消息生产者将收到来自ems服务器的错误,并且无法发送新消息

maxbytes属性未阻止将大于maxbytes的消息发送到队列