Производительность JMS: BytesMessage против ObjectMessage - PullRequest
2 голосов
/ 04 августа 2009

С точки зрения производительности JMS, я прочитал, что ObjectMessage следует избегать по соображениям производительности.

Насколько плохо ObjectMessage с точки зрения производительности? Должен ли я сериализовать в BytesMessage и десериализовать вручную?

Ответы [ 2 ]

9 голосов
/ 04 августа 2009

Повышение производительности ObjectMessage связано с процессом сериализации java.io. Если вы делаете это сами и используете ByteMessage, вы просто делаете то, что делал бы сам JMS, и вам не будет лучше.

Если вам нужно отправлять Java-объекты через JMS, вы должны использовать ObjectMessage, это то, что предоставляет API. Это позволяет контейнеру выполнять некоторые оптимизации, например, JBoss будет использовать собственный проприетарный протокол сериализации, который значительно быстрее стандартного java.io.

1 голос
/ 15 февраля 2013

Пример использования формата данных Jackson Smile, который может быть на 50% быстрее и меньше, чем сериализация JDK, поэтому 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);
    }
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...