![](/img/trans.png)
[英]ActiveMq Producer is taking longer time to send JMS message to Destination queue
[英]Message Header Size for JMS producer in ActiveMq v5.10
我正在嘗試使用與郵件大小相關的統計信息
(最小郵件大小,最大郵件大小,平均郵件大小,總郵件大小,使用
DestinationStatistics .getMessages()。getCount()
)在ActiveMQ v5.10中提供),發現標頭大小為1028個字節(發送不同大小的消息,API返回的大小為1028個字節以上)。 我不明白為什么這是大小。
有前綴嗎? 反正有沒有看到什么構成標題。
謝謝
編輯:
因此,基本上,生產者在隊列上使用java代碼向代理發送了1024個字節(字符)的文本消息,以供消費者偵聽該隊列時收到。 我正在使用上述API記錄消息大小,發現報告的消息大小為2052字節,而不是1024字節。
您看到的大小是郵件總大小的近似值。 代理將不會跟蹤確切的消息大小,因為在將消息的一部分分發到更新這些統計信息的核心之前,它們會在Broker上進行編組。 添加了額外的字節開銷值1024,以解決在對消息進行編碼和在線發送時添加的字節。 無法從這些統計信息中區分出消息屬性的大小與主體大小等的大小,此數字只是對總編碼消息大小的最佳猜測。
在客戶端應用程序中打開ActiveMQ的跟蹤級日志記錄,以查看有關已發送消息的更多詳細信息。 消息可以並且將包含代理和客戶端使用的大量“元數據”,例如,在我們自己的服務器軟件中發送簡單的測試消息將顯示以下內容:
[scheduler-1]跟蹤org.apache.activemq.ActiveMQSession-ID:esaj-HP-59250-1410162276798-1:1:36發送消息:ActiveMQTextMessage {commandId = 0,responseRequired = false,messageId = ID:esaj-HP- 59250-1410162276798-1:1:36:1:2,originalDestination = null,originalTransactionId = null,producerId = ID:esaj-HP-59250-1410162276798-1:1:36:1,destination = topic:// server。診斷,transactionId = null,到期時間= 1410162336586,timestamp = 1410162324586,到達= 0,brokerInTime = 0,brokerOutTime = 0,correlationId = null,replyTo = null,持久化= false,type = null,優先級= 4,groupID = null, groupSequence = 0,targetConsumerId = null,壓縮= false,userID = null,內容= null,marshalledProperties = null,dataStructure = null,redeliveryCounter = 0,大小= 0,屬性= {
** OMITTED, OUR CUSTOM PROPS **
}, readOnlyProperties = true,readOnlyBody = true,droppable = false,jmsXGroupFirstForConsumer = false,文本= {** THE ACTUAL DATA **
}}
這是與ActiveMQ 5.9一起使用的,但是如您所見,ActiveMQ會自行生成許多標頭數據。 至於如何真正擺脫它,我不確定,我並不是真正的ActiveMQ專家,但是我想說一千字節的頭數據對於ActiveMQ來說似乎只是“正常”。
編輯 :我看了看我們的消息代理,所有隊列和主題都顯示平均消息大小超過1024字節,這使我不得不深入研究ActiveMQ(5.9)源。 我在org.apache.activemq.command.Message中找到了這個:
/**
* The default minimum amount of memory a message is assumed to use
*/
public static final int DEFAULT_MINIMUM_MESSAGE_SIZE = 1024;
//Omitted other stuff...
@Override
public int getSize() {
int minimumMessageSize = getMinimumMessageSize();
if (size < minimumMessageSize || size == 0) {
size = minimumMessageSize;
if (marshalledProperties != null) {
size += marshalledProperties.getLength();
}
if (content != null) {
size += content.getLength();
}
}
return size;
}
protected int getMinimumMessageSize() {
int result = DEFAULT_MINIMUM_MESSAGE_SIZE;
//let destination override
MessageDestination dest = regionDestination;
if (dest != null) {
result=dest.getMinimumMessageSize();
}
return result;
}
getSize()在很多地方都使用過,例如MessageQueue , ActiveMQSession等。我沒有更深入地研究過,但看起來至少保留了1024個字節(1 KB),或者至少在每條消息的統計信息中假定了。 統計信息似乎收集在Queue和Topic類中,並使用getSize()
返回的值,例如,這是Queue.messageSent的開頭:
final void messageSent(final ConnectionContext context, final Message msg) throws Exception {
destinationStatistics.getEnqueues().increment();
destinationStatistics.getMessages().increment();
destinationStatistics.getMessageSize().addSize(msg.getSize());
我不知道發送空消息時實際上是否通過有線傳輸了1024個字節,但是至少統計數據似乎是這樣假設的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.