JMSによる非同期処理の実装 に引き続き、ActiveMQのパフォーマンスを検証してみたいと思います。
アプリケーションのパフォーマンスを計るため、MessageBroker とメッセージを処理するAPを別のPCで実行させる事にします。
TestJmsServer2.java
前回のTestJmsServerではメールを送信させていましたが、負荷テストでそれをやってしまうとメールサーバーが大変な事になってしまうので、変わりに1メッセージ辺り1秒のウェイトを入れる事にします。
また、処理したメッセージをコンソールに出力させます。
-
package test.server;
-
-
import javax.jms.JMSException;
-
import javax.jms.ObjectMessage;
-
import javax.jms.Queue;
-
import javax.jms.QueueConnection;
-
import javax.jms.QueueReceiver;
-
import javax.jms.QueueSession;
-
-
import org.apache.activemq.ActiveMQConnection;
-
import org.apache.activemq.ActiveMQConnectionFactory;
-
-
import test.TestMessage;
-
-
public class TestJmsServer2 {
-
public static boolean bQuit = false;
-
-
QueueConnection connection = null;
-
QueueSession session = null;
-
QueueReceiver receiver = null;
-
-
try{
-
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL);
-
connection = factory.createQueueConnection();
-
-
session = connection.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
-
Queue queue = session.createQueue("TestMailQueue");
-
-
receiver = session.createReceiver(queue);
-
-
connection.start();
-
-
while(!bQuit) {
-
ObjectMessage msg = (ObjectMessage)receiver.receive();
-
TestMessage mailMessage = (TestMessage)msg.getObject();
-
-
-
try {
-
e1.printStackTrace();
-
}
-
-
}
-
-
} catch (JMSException e) {
-
e.printStackTrace();
-
-
} finally {
-
try {
-
if (receiver != null) {
-
receiver.close();
-
}
-
if (session != null) {
-
session.close();
-
}
-
if (connection != null) {
-
connection.close();
-
}
-
-
} catch (JMSException e) {
-
e.printStackTrace();
-
}
-
}
-
}
-
}
TestJmsLoop.java
呼出側は1000回のメッセージをノーウェイトで実行させます。
また、個々のメッセージを識別出来る様にメッセージにループのインデックスを渡しています。
-
package test;
-
-
import javax.jms.JMSException;
-
import javax.jms.Message;
-
import javax.jms.Queue;
-
import javax.jms.QueueConnection;
-
import javax.jms.QueueConnectionFactory;
-
import javax.jms.QueueSender;
-
import javax.jms.QueueSession;
-
-
import org.apache.activemq.ActiveMQConnectionFactory;
-
-
public class TestJmsLoop {
-
-
-
-
QueueConnection connection = null;
-
QueueSession session = null;
-
QueueSender sender = null;
-
-
try {
-
-
QueueConnectionFactory factory = new ActiveMQConnectionFactory("tcp://MessageBrokerのアドレス:61616");
-
connection = factory.createQueueConnection();
-
-
session = connection.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
-
Queue queue = session.createQueue("TestMailQueue");
-
sender= session.createSender(queue);
-
-
connection.start();
-
-
for (int i = 0; i <1000; i++) {
-
TestMessage mailMessage = new TestMessage();
-
mailMessage.setSubject("ActiveMQ test");
-
mailMessage.setFromAddr("送信者アドレス");
-
mailMessage.setToAddr("受信者アドレス");
-
mailMessage.setMessage("メールのテストです。:" + i);
-
-
Message msg = session.createObjectMessage(mailMessage);
-
-
sender.send(msg);
-
}
-
-
} catch (JMSException e) {
-
e.printStackTrace();
-
-
} finally {
-
try {
-
if (sender != null) {
-
sender.close();
-
}
-
if (session != null) {
-
session.close();
-
}
-
if (connection != null) {
-
connection.close();
-
}
-
} catch (JMSException e) {
-
e.printStackTrace();
-
}
-
}
-
-
-
}
-
}
別PCにて、MessageBrokerとTestJmsServer2も実行させておきます。
TestJmsLoop を実行してみます。
実行して数秒後には処理が終了しました。
-
TestJms:2953
それではTestJmsServer2の方を見てみましょう。
-
メールのテストです。:0
-
メールのテストです。:1
-
メールのテストです。:2
-
メールのテストです。:3
-
メールのテストです。:4
-
メールのテストです。:5
-
メールのテストです。:6
-
メールのテストです。:7
-
メールのテストです。:8
-
メールのテストです。:9
-
メールのテストです。:10
-
メールのテストです。:11
-
メールのテストです。:12
-
メールのテストです。:13
-
メールのテストです。:14
-
メールのテストです。:15
-
メールのテストです。:16
-
メールのテストです。:17
-
メールのテストです。:18
-
メールのテストです。:19
-
メールのテストです。:20
-
メールのテストです。:21
取得したメッセージを順に処理中である事が判ります。
TestJmsLoopが数秒で開放された事から、MessageBrokerがメッセージをストックしている事が判ります。
つづく



