2009-08-04 22 views
2

JMSパフォーマンスに関しては、パフォーマンス上の理由からObjectMessageを避けるべきであることを読んでいます。JMSパフォーマンス:BytesMessage vs ObjectMessage

ObjectMessageのパフォーマンスはどれくらいですか? BytesMessageにシリアル化して手動でデシリアライズする必要がありますか?

+1

は、あなたが問題に遭遇したことがありますか?あなたは2つのベンチマークをしましたか?これは実際にアプリケーションの中で最も遅い部分ですか? –

+0

いいえ、私は実際にはベンチマークしていません。私はかなりの量のコードを書き直しており、問題があることを認識するためだけに1つの方法を頭を下げたくありませんでした。私の研究を最初にしたいと思った。 私はこの9歳のスレッドに出会い、新しいものは見ていませんでした:http://www.mail-archive.com/[email protected]/msg07681.html 何か聞きたいと思っていましたより権威ある – Tazzy531

答えて

8

ObjectMessageのパフォーマンスオーバーヘッドは、java.ioのシリアル化プロセスのためです。あなた自身がそれを行い、ByteMessageを使用するならば、あなたはJMSが行うことをやっているだけです。

JMS経由でJavaオブジェクトを送信する必要がある場合は、APIが提供するものであるObjectMessageを使用する必要があります。これにより、コンテナはいくつかの最適化を行うことができます。 JBossは標準のjava.ioよりかなり高速な独自のシリアル化プロトコルを使用します。この場合

+0

これは私があまりにも思ったことです... – Tazzy531

+1

私はヘッセ行列の直列化を見てきました。オブジェクトをJava Serializationの約1/2の空間にシリアル化しているようです。私はまだ実際のテストを行っていませんが、この+ BytesMessageを使うのがObjectMessageより有利かもしれません。 – Dave

+0

私はおそらく、Hessian/Burlap上でJBoss Serializationを使うでしょうが、原則として、標準の直列化に代わるものがあります。 – skaffman

1

そうBytesMessageは、最大50%高速化、小型JDKのシリアライズを超えることはできジャクソンスマイルデータ・フォーマットを使用した例の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); 
    } 
    } 

} 
関連する問題