【问题标题】:JMS Performance: BytesMessage vs ObjectMessageJMS 性能:BytesMessage 与 ObjectMessage
【发布时间】:2010-11-16 16:37:59
【问题描述】:

在 JMS 性能方面,我已经读到出于性能原因应该避免使用 ObjectMessage。

ObjectMessage 在性能方面有多糟糕? 我应该序列化为 BytesMessage 并手动反序列化吗?

【问题讨论】:

  • 您遇到问题了吗?你对两者进行了基准测试吗?这真的是您的应用程序中最慢的部分吗?
  • 不,我实际上没有进行基准测试。我正在重写大量代码,并且不想只使用一种方法才意识到它存在问题。想先做我的研究。我遇到了这个 9 年的帖子,没有看到任何更新的内容:mail-archive.com/jboss-development@lists.sourceforge.net/… 希望听到更权威的消息。

标签: java serialization jms


【解决方案1】:

使用 Jackson Smile 数据格式的示例,它可以比 JDK 序列化快 50% 并且更小,因此在这种情况下 BytesMessage 将击败 ObjectMessage:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.smile.SmileFactory;
import com.fasterxml.jackson.dataformat.smile.SmileGenerator;
import org.springframework.jms.core.MessageCreator;

import javax.jms.BytesMessage;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;

public class BytesMessageCreator<T> implements MessageCreator
{
  public static final ObjectMapper
    MAPPER=new ObjectMapper(new SmileFactory().disable(SmileGenerator.Feature.ENCODE_BINARY_AS_7BIT));

  final String messageId;
  final T pojo;

  public BytesMessageCreator(final T pojo)
  {
    messageId=null;
    this.pojo=pojo;
  }

  public BytesMessageCreator(final String messageId, final T pojo)
  {
    this.messageId=messageId;
    this.pojo=pojo;
  }

  @Override
  public Message createMessage(final Session session) throws JMSException
  {
    try{
      final BytesMessage message=session.createBytesMessage();
      message.writeBytes(MAPPER.writeValueAsBytes(pojo));
      if(messageId != null){
        message.setJMSMessageID(messageId);
      }
      return message;
    } catch(Exception e){
      throw new RuntimeException(e);
    }
  }

}

【讨论】:

    【解决方案2】:

    ObjectMessage 的性能开销是因为java.io 序列化过程。如果您自己这样做并使用ByteMessage,那么您只是在做 JMS 自己会做的事情,而且不会有更好的结果。

    如果你需要通过 JMS 发送 java 对象,你应该使用ObjectMessage,这就是 API 提供的。这允许容器进行一些优化,例如JBoss 将使用自己的专有序列化协议,这比标准的java.io 快得多。

    【讨论】:

    • 我一直在研究 Hessian 序列化。它似乎将对象序列化到大约 1/2 的空间作为 Java 序列化。我还没有做任何真正的测试,但在这种情况下,使用 this+BytesMessage 似乎比 ObjectMessage 更有优势。
    • 我可能会使用 JBoss 序列化而不是 Hessian/Burlap,但原则上是的,标准序列化有更好的替代方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2011-07-25
    • 2015-04-20
    • 2023-03-16
    相关资源
    最近更新 更多