1 メッセージ圧縮機能の使用

Novell exteNd Messaging PlatformのJMSはJMS_jbmq_Compressメッセージプロパティを定義します。このプロパティは、メッセージの送信/受信プロセスの一部として、メッセージの自動圧縮を可能にします。圧縮はコストの掛かる操作ですが、パフォーマンスを向上できる場合があります。たとえば、使用できるネットワーク接続が遅い場合、または繰り返しパターンを含む大きなメッセージを送信する場合、圧縮を使用するとパフォーマンスが向上することがあります。

圧縮を使用することにより、持続メッセージのデータベースに保存されるデータを少なく抑えられるため、JMSサーバでパフォーマンスが向上することがあります。圧縮がアプリケーションで有効かどうかを判断するには、テストを行います。この例で示すプログラムを使用すると、圧縮および解凍されるメッセージの送受信を簡単に測定し、結果を出力できます。

package compress;
                                                                           
import javax.naming.InitialContext;
                                                                           
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.Message;
import javax.jms.TextMessage;
import javax.jms.QueueSender;
import javax.jms.DeliveryMode;
import javax.jms.QueueSession;
import javax.jms.QueueReceiver;
import javax.jms.MessageListener;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
                                                                           
/**
   This class does a rough performance comparison of sending/receiving
   compressed and uncompressed large text messages.
 */
                                                                           
public class Perf
{
    public static void main(String[] args) throws Exception
    {
    |   // resolve the queue connection factory and queue from JNDI
    |   InitialContext ctx = new InitialContext();
    |   QueueConnectionFactory connFactory = (QueueConnectionFactory)
    |       ctx.lookup("queue/connectionFactory");
    |   Queue queue = (Queue) ctx.lookup("queue/queue0");
    |                                                                      
    |   // create a queue connection
    |   QueueConnection queueConn = connFactory.createQueueConnection();
    |                                                                      
    |   // create the queue session with auto acknowledge
    |   QueueSession session =
    |       queueConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
    |                                                                      
    |   // create the sender and receiver
    |   QueueSender sender = session.createSender(queue);
    |   QueueReceiver receiver = session.createReceiver(queue);
    |                                                                      
    |   // start the queue connection
    |   queueConn.start();
    |                                                                      
    |   // create a very large text message
    |   String s = "text with lots of repetivive patterns ... ";
    |   for (int i = 0; i < 10; i++) s += s;
    |   Message message = session.createTextMessage(s);
    |                                                                      
    |   // record time before starting test
    |   long start = System.currentTimeMillis();
    |                                                                      
    |   // loop to send messages
    |   for (int i = 0; i < 50; i++)
    |       sender.send(message);
    |                                                                      
    |   // loop to receive messages
    |   for (int i = 0; i < 50; i++) {
    |   |   TextMessage textMessage = (TextMessage) receiver.receive();
    |   |   if (textMessage.getText().length() != s.length())
    |   |       throw new Exception("wrong message: " + textMessage);
    |   }
    |                                                                      
    |   // record time after test finished
    |   long stop = System.currentTimeMillis();
    |                                                                      
    |   // print result
    |   System.out.println("without compression: " + (stop-start) + " ms");
    |                                                                      
    |   // enable compression
    |   message.setBooleanProperty("JMS_jbmq_Compress", true);
    |                                                                      
    |   // record time before starting test
    |   start = System.currentTimeMillis();
    |                                                                      
    |   // loop to send messages
    |   for (int i = 0; i < 50; i++)
    |       sender.send(message);
    |                                                                      
    |   // loop to receive messages
    |   for (int i = 0; i < 50; i++) {
    |   |   TextMessage textMessage = (TextMessage) receiver.receive();
    |   |   if (textMessage.getText().length() != s.length())
    |   |       throw new Exception("wrong message: " + textMessage);
    |   }
    |                                                                      
    |   // record time after test finished
    |   stop = System.currentTimeMillis();
    |                                                                      
    |   // print result
    |   System.out.println("with compression   : " + (stop-start) + " ms");
    |                                                                      
    |   queueConn.close();
    }
}
この例ではまず、繰り返しパターンの大きなテキストメッセージを作成します。次に、このメッセージを50回送受信しています(最初は圧縮せずに、次は圧縮して送信)。結果は、実行のたびに出力されます。アプリケーションに有効な場合は、この例を変更して一時メッセージを使用することもできます。2つの異なるプロセスで送信者と受信者を作成すると、より現実的な結果を得ることができます。

トップに戻る


Copyright © 2000-2003, Novell, Inc.All rights reserved.