ActiveMq v5.10中JMS生成器的消息头大小

时间:2014-09-01 14:16:28

标签: java jms activemq middleware

我试图使用与邮件大小相关的统计信息 (最小邮件大小,最大邮件大小,平均邮件大小,使用

的邮件总大小)
  

DestinationStatistics。的getMessages()。getCount将()

)在ActiveMQ v5.10中提供,发现头大小为1028字节(API返回的不同大小和大小的发送消息多1028字节)。我无法理解为什么尺寸这个。

是前缀吗?无论如何看看是什么构成标题。

由于

修改
因此,生产者基本上使用队列中的java代码发送1024字节(字符)的文本消息,该消息由消费者监听到该队列接收。我使用上面提到的API记录消息大小,我发现报告的消息大小是2052字节而不是1024字节。

2 个答案:

答案 0 :(得分:2)

您看到的大小是总邮件大小的近似值。代理将不会跟踪确切的消息大小,因为在将这些消息传递到更新这些统计信息的核心之前,将在Broker上解组消息的一部分。添加1024的附加字节开销值是为了考虑在线路上编码和发送消息时添加的字节数。没有办法从这些统计信息中分离出消息属性的大小与正文大小等的大小等等,这个数字只是编码消息总大小的最佳猜测。

答案 1 :(得分:1)

在客户端应用程序中打开ActiveMQ的跟踪级别日志记录,以查看有关已发送消息的更多详细信息。消息可以并且将包含经纪人和客户端使用的大量“元数据”,例如在我们自己的服务器软件中发送简单的测试消息显示以下内容:

  

[scheduler-1] TRACE 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.diagnostics,transactionId = null,expiration =   1410162336586,timestamp = 1410162324586,arrival = 0,brokerInTime =   0,brokerOutTime = 0,correlationId = null,replyTo = null,持久化   = false,type = null,priority = 4,groupID = null,groupSequence = 0,targetConsumerId = null,compressed = false,userID = null,content =   null,marshalledProperties = null,dataStructure = null,   redeliveryCounter = 0,size = 0,properties = {** OMITTED, OUR CUSTOM PROPS **},readOnlyProperties = true,readOnlyBody = true,droppable   = false,jmsXGroupFirstForConsumer = false,text = {** 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千字节(1千字节)。统计信息似乎收集在队列 - 和主题 - 类中,并使用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个字节,但至少统计数据似乎是假设的。