簡體   English   中英

ActiveMq v5.10中JMS生產者的消息頭大小

[英]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()在很多地方都使用過,例如MessageQueueActiveMQSession等。我沒有更深入地研究過,但看起來至少保留了1024個字節(1 KB),或者至少在每條消息的統計信息中假定了。 統計信息似乎收集在QueueTopic類中,並使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM