パフォーマンスを図る為にループ回数を変えつつ5回連続して実行させてみます。
5回連続実行の間、MessageBrokerのメッセージクリアせず、TestJmsServer2は順次メッセージの取得を行っています。

TestJmsLoop5.java

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 TestJmsLoop5 {
  14.  
  15. public static void main(String[] args){
  16. for (int i = 0; i <5; i++) {
  17. loops();
  18. }
  19. }
  20.  
  21. public static void loops() {
  22. long startTime = System.currentTimeMillis();
  23.  
  24. QueueConnection connection = null;
  25. QueueSession session = null;
  26. QueueSender sender = null;
  27.  
  28. try {
  29. QueueConnectionFactory factory = new ActiveMQConnectionFactory("tcp://MessageBrokerのアドレス:61616");
  30. connection = factory.createQueueConnection();
  31.  
  32. session = connection.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
  33. Queue queue = session.createQueue("TestMailQueue");
  34. sender= session.createSender(queue);
  35.  
  36. connection.start();
  37.  
  38. for (int i = 0; i <1000; i++) {
  39. TestMessage mailMessage = new TestMessage();
  40. mailMessage.setSubject("ActiveMQ test");
  41. mailMessage.setFromAddr("tmaru@inter-xxxx.com");
  42. mailMessage.setToAddr("tmaru2@inter-xxxx.com");
  43. mailMessage.setMessage("メールのテストです。:" + i);
  44.  
  45. Message msg = session.createObjectMessage(mailMessage);
  46.  
  47. sender.send(msg);
  48. }
  49.  
  50. } catch (JMSException e) {
  51. e.printStackTrace();
  52.  
  53. } finally {
  54. try {
  55. if (sender != null) {
  56. sender.close();
  57. }
  58. if (session != null) {
  59. session.close();
  60. }
  61. if (connection != null) {
  62. connection.close();
  63. }
  64. } catch (JMSException e) {
  65. e.printStackTrace();
  66. }
  67. }
  68.  
  69. long endTime = System.currentTimeMillis();
  70.  
  71. System.out.println( "TestJms:" + (endTime - startTime) );
  72. }
  73. }

1000ループx5回

CODE:
  1. TestJms:2985
  2. TestJms:1890
  3. TestJms:1766
  4. TestJms:1750
  5. TestJms:1609

初期化にコストが掛かっているのか、2回目以降とで若干差が出ていますが、1件辺り1.6m~1.8m位で処理されています。

1万ループx5回

CODE:
  1. TestJms:17047
  2. TestJms:45031
  3. TestJms:39390
  4. TestJms:14813
  5. TestJms:36828

1.4m~1.7m辺りは前測定とそう変わりはありません。
合間に3.6m~と波があります。1万件を超えた辺りで記憶領域の拡張等によるコストが発生しているという事でしょうか。

10万ループx5回

CODE:
  1. TestJms:306203
  2. TestJms:298610
  3. TestJms:311609
  4. TestJms:302125
  5. TestJms:335469

回数が増えた事で差が薄まりました。
急激に値が変化しない事から、ピーク時は2.9m~3.3m位なのだと考えられます。

送信するメッセージの容量やマシンスペック等々により負荷のタイミングは変わると考えられますが、(50万件までは)件数による大きな性能劣化は見られませんでした。

以下、測定に使用したマシンスペックになります。
MessageBroker&TestJmsServer2
Redhat9 Celeron 1.70Ghz

TestJmsLoop5
WindowsXP Pentium4 3.00Ghz