簡體   English   中英

JMS 消息大小

[英]JMS message size

我目前正在為使用 JMS(即 Spring 框架 JMS 和 Active MQ)在服務器和客戶端之間發送帶有有效負載的消息的應用程序開發帶寬限制功能(不要問我為什么,這不是我的決定)。

我發現了很多限制傳入 JMS 消息的限制方法(但沒有一個基於實際帶寬負載),但是我沒有找到任何可能的方法來限制傳出消息流。 所以我決定自己寫漏桶算法

有什么方法可以獲取 JMS 消息的大小嗎? 除了 Java 中的“sizeof”實現( 在 Java 中,確定 object 的大小的最佳方法是什么?

我認為您沒有比測量其序列化大小更好的方法來確定 JMS 消息大小。

但是您可以根據需要添加一些優化。 有幾種類型的消息(例如 MapMessage、ObjectMessage、TextMessage)。

文本消息的大小是其文本的長度。 map 消息的大小是其所有字段的總大小。 這些字段是原語或 java.util.Date,因此測量它們不是問題。 Object 消息包含可序列化的 object,因此您可以通過寫入 ByteOutputStream 來測量其大小。

如果您使用大多數 JMS 提供程序的隱藏功能來發送延遲消息,我認為使用 JMS 實現漏桶可能會被簡化。 您可以在將消息排入隊列時對其進行測量,並決定您希望訂閱者何時接收它。 有關如何發送延遲消息的詳細信息,請閱讀此處: http://alexradzin.blogspot.com/2010/10/send-delayed-jms-messages.html

由於 JMS 消息在發送過程中是序列化的,因此獲取消息大小的最佳方法是通過 ObjectOutputStream

private int getMessageSizeInBytes(MessageWrapper message) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(baos);
    oos.writeObject(message);
    oos.close();
    return baos.size();
}

除了@AlexR 之前的評論,BytesMessage 還有一個 getBodyLength() 方法

http://download.oracle.com/javaee/1.4/api/javax/jms/BytesMessage.html#getBodyLength

您可以通過捕獲使用 Session.createMessage() 創建的一些對象來估計傳輸中典型的 header 大小 - 即沒有有效負載的 JMS 消息類型。 我想我很想直接使用 byte[] 中的有效負載,使用 BytesMessage,如果帶寬很關鍵,則通過 ZipOutputStream 進行壓縮。 此外,JMS 允許提示抑制消息時間戳和消息 ID,這可能有助於減少消息大小,例如

http://download.oracle.com/javaee/1.4/api/javax/jms/MessageProducer.html#setDisableMessageTimestamp%28boolean%29

盡管不要求提供者支持它,

如果 JMS 提供者接受此提示,則這些消息的消息 ID 必須設置為 null; 如果提供者忽略提示,則消息 ID 必須設置為其正常的唯一值

我曾經在 WebSphere MQ 各處使用帶寬非常有限的 JMS,並且可以通過這種方式獲得非常小的消息大小 - 盡管在這種情況下本機線框格式也針對大小進行了優化

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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