Java ActiveMq v5.10中JMS生产者的消息头大小

Java ActiveMq v5.10中JMS生产者的消息头大小,java,jms,activemq,middleware,Java,Jms,Activemq,Middleware,我试图使用与消息大小相关的统计数据 (最小消息大小、最大消息大小、平均消息大小、总消息大小(按使用) .getMessages().getCount() )在ActiveMQ v5.10中提供,发现头大小为1028字节(不同大小的发送消息,API返回的大小为1028字节以上)。我不明白为什么这个尺寸 它有前缀吗?是否有任何方法可以查看标题的构成 谢谢 编辑: 所以,生产者基本上是使用队列上的java代码向代理发送一条1024字节(chars)的文本消息,监听该队列的消费者会收到该消息。我使用上述

我试图使用与消息大小相关的统计数据
(最小消息大小、最大消息大小、平均消息大小、总消息大小(按使用)

.getMessages().getCount()

)在ActiveMQ v5.10中提供,发现头大小为1028字节(不同大小的发送消息,API返回的大小为1028字节以上)。我不明白为什么这个尺寸

它有前缀吗?是否有任何方法可以查看标题的构成

谢谢

编辑:

所以,生产者基本上是使用队列上的java代码向代理发送一条1024字节(chars)的文本消息,监听该队列的消费者会收到该消息。我使用上述API记录消息大小,发现报告的消息大小是2052字节,而不是1024字节。

您看到的大小是总消息大小的近似值。代理将不会跟踪确切的消息大小,因为消息的一部分在被分派到更新这些统计信息的核心之前在代理上被解除了签名。额外的字节开销值1024被添加到对消息进行编码并在线路上发送时添加的字节的帐户中。无法从这些统计数据中分离出消息属性的大小与正文的大小等,此数字只是对编码消息总大小的最佳猜测。

您看到的大小是消息总大小的近似值。代理将不会跟踪确切的消息大小,因为消息的一部分在被分派到更新这些统计信息的核心之前在代理上被解除了签名。额外的字节开销值1024被添加到对消息进行编码并在线路上发送时添加的字节的帐户中。无法从这些统计数据中分离出消息属性的大小与正文的大小等,此数字只是对编码消息总大小的最佳猜测。

您看到的大小是消息总大小的近似值。代理将不会跟踪确切的消息大小,因为消息的一部分在被分派到更新这些统计信息的核心之前在代理上被解除了签名。额外的字节开销值1024被添加到对消息进行编码并在线路上发送时添加的字节的帐户中。无法从这些统计数据中分离出消息属性的大小与正文的大小等,此数字只是对编码消息总大小的最佳猜测。

您看到的大小是消息总大小的近似值。代理将不会跟踪确切的消息大小,因为消息的一部分在被分派到更新这些统计信息的核心之前在代理上被解除了签名。额外的字节开销值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,目的地= topic://server.diagnostics,transactionId=null,过期= 1410162336586,时间戳=1410162324586,到达=0,BrokerTime= 0,BrokerRoutTime=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={
**省略,我们的定制道具**
},readOnlyProperties=true,readOnlyBody=true,可拖放 =false,jmsXGroupFirstForConsumer=false,text={
**实际数据**
}

这是在ActiveMQ 5.9中实现的,但正如您所看到的,ActiveMQ自己会生成大量的头数据。至于如何真正摆脱它,我不确定,我不是一个真正的ActiveMQ专家,但我想说,对于ActiveMQ来说,一个千字节的头数据似乎是“正常的”

编辑:我查看了我们的消息代理,所有队列和主题都显示平均消息大小超过1024字节,这使我深入研究了ActiveMQ(5.9)源代码。我在org.apache.activemq.command.Message中找到了这个:


我不知道发送空消息时是否有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,目的地= topic://server.diagnostics,transactionId=null,过期= 1410162336586,时间戳=1410162324586,到达=0,BrokerTime= 0,BrokerRoutTime=0,correlationId=null,
/**
 * 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;
}
final void messageSent(final ConnectionContext context, final Message msg) throws Exception {
    destinationStatistics.getEnqueues().increment();
    destinationStatistics.getMessages().increment();
    destinationStatistics.getMessageSize().addSize(msg.getSize());