JMSによる非同期処理の実装 に引き続き、ActiveMQのパフォーマンスを検証してみたいと思います。

アプリケーションのパフォーマンスを計るため、MessageBroker とメッセージを処理するAPを別のPCで実行させる事にします。

TestJmsServer2.java
前回のTestJmsServerではメールを送信させていましたが、負荷テストでそれをやってしまうとメールサーバーが大変な事になってしまうので、変わりに1メッセージ辺り1秒のウェイトを入れる事にします。
また、処理したメッセージをコンソールに出力させます。

JAVA:
  1. package test.server;
  2.  
  3. import javax.jms.JMSException;
  4. import javax.jms.ObjectMessage;
  5. import javax.jms.Queue;
  6. import javax.jms.QueueConnection;
  7. import javax.jms.QueueReceiver;
  8. import javax.jms.QueueSession;
  9.  
  10. import org.apache.activemq.ActiveMQConnection;
  11. import org.apache.activemq.ActiveMQConnectionFactory;
  12.  
  13. import test.TestMessage;
  14.  
  15. public class TestJmsServer2 {
  16. public static boolean bQuit = false;
  17.  
  18. public static void main(String[] args) {
  19. QueueConnection connection = null;
  20. QueueSession session = null;
  21. QueueReceiver receiver = null;
  22.  
  23. try{
  24. ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL);
  25. connection = factory.createQueueConnection();
  26.  
  27. session = connection.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
  28. Queue queue = session.createQueue("TestMailQueue");
  29.  
  30. receiver = session.createReceiver(queue);
  31.  
  32. connection.start();
  33.  
  34. while(!bQuit) {
  35. ObjectMessage msg = (ObjectMessage)receiver.receive();
  36. TestMessage mailMessage = (TestMessage)msg.getObject();
  37.  
  38. System.out.println(mailMessage.getMessage());
  39.  
  40. try {
  41. Thread.sleep(1000);
  42. } catch (InterruptedException e1) {
  43. e1.printStackTrace();
  44. }
  45.  
  46. }
  47.  
  48. } catch (JMSException e) {
  49. e.printStackTrace();
  50.  
  51. } finally {
  52. try {
  53. if (receiver != null) {
  54. receiver.close();
  55. }
  56. if (session != null) {
  57. session.close();
  58. }
  59. if (connection != null) {
  60. connection.close();
  61. }
  62.  
  63. } catch (JMSException e) {
  64. e.printStackTrace();
  65. }
  66. }
  67. }
  68. }

TestJmsLoop.java
呼出側は1000回のメッセージをノーウェイトで実行させます。
また、個々のメッセージを識別出来る様にメッセージにループのインデックスを渡しています。

JAVA:
  1. package test;
  2.  
  3. import javax.jms.JMSException;
  4. import javax.jms.Message;
  5. import javax.jms.Queue;
  6. import javax.jms.QueueConnection;
  7. import javax.jms.QueueConnectionFactory;
  8. import javax.jms.QueueSender;
  9. import javax.jms.QueueSession;
  10.  
  11. import org.apache.activemq.ActiveMQConnectionFactory;
  12.  
  13. public class TestJmsLoop {
  14.  
  15. public static void main(String[] args){
  16.  
  17. long startTime = System.currentTimeMillis();
  18.  
  19. QueueConnection connection = null;
  20. QueueSession session = null;
  21. QueueSender sender = null;
  22.  
  23. try {
  24.  
  25. QueueConnectionFactory factory = new ActiveMQConnectionFactory("tcp://MessageBrokerのアドレス:61616");
  26. connection = factory.createQueueConnection();
  27.  
  28. session = connection.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
  29. Queue queue = session.createQueue("TestMailQueue");
  30. sender= session.createSender(queue);
  31.  
  32. connection.start();
  33.  
  34. for (int i = 0; i <1000; i++) {
  35. TestMessage mailMessage = new TestMessage();
  36. mailMessage.setSubject("ActiveMQ test");
  37. mailMessage.setFromAddr("送信者アドレス");
  38. mailMessage.setToAddr("受信者アドレス");
  39. mailMessage.setMessage("メールのテストです。:" + i);
  40.  
  41. Message msg = session.createObjectMessage(mailMessage);
  42.  
  43. sender.send(msg);
  44. }
  45.  
  46. } catch (JMSException e) {
  47. e.printStackTrace();
  48.  
  49. } finally {
  50. try {
  51. if (sender != null) {
  52. sender.close();
  53. }
  54. if (session != null) {
  55. session.close();
  56. }
  57. if (connection != null) {
  58. connection.close();
  59. }
  60. } catch (JMSException e) {
  61. e.printStackTrace();
  62. }
  63. }
  64.  
  65. long endTime = System.currentTimeMillis();
  66.  
  67. System.out.println( "TestJms:" + (endTime - startTime) );
  68. }
  69. }

別PCにて、MessageBrokerとTestJmsServer2も実行させておきます。

TestJmsLoop を実行してみます。
実行して数秒後には処理が終了しました。

CODE:
  1. TestJms:2953

それではTestJmsServer2の方を見てみましょう。

CODE:
  1. メールのテストです。:0
  2. メールのテストです。:1
  3. メールのテストです。:2
  4. メールのテストです。:3
  5. メールのテストです。:4
  6. メールのテストです。:5
  7. メールのテストです。:6
  8. メールのテストです。:7
  9. メールのテストです。:8
  10. メールのテストです。:9
  11. メールのテストです。:10
  12. メールのテストです。:11
  13. メールのテストです。:12
  14. メールのテストです。:13
  15. メールのテストです。:14
  16. メールのテストです。:15
  17. メールのテストです。:16
  18. メールのテストです。:17
  19. メールのテストです。:18
  20. メールのテストです。:19
  21. メールのテストです。:20
  22. メールのテストです。:21

取得したメッセージを順に処理中である事が判ります。
TestJmsLoopが数秒で開放された事から、MessageBrokerがメッセージをストックしている事が判ります。

つづく