Java:使用多个线程将消息发送到JMS队列

我正在尝试编写一个Java类来使用多个线程从JMS队列发送和读取消息以加快速度。 我有以下代码。

System.out.println("Sending messages"); long startTime = System.nanoTime(); Thread threads[] = new Thread[NumberOfThreads]; for (int i = 0; i < threads.length; i ++) { threads[i] = new Thread() { public void run() { try { for (int i = 0; i < NumberOfMessagesPerThread; i ++) { sendMessage("Hello"); } } catch (Exception e) { e.printStackTrace(); } } }; threads[i].start(); } //Block until all threads are done so we can get total time for (Thread thread : threads) { thread.join(); } long endTime = System.nanoTime(); long duration = (endTime - startTime) / 1000000; System.out.println("Done in " + duration + " ms"); 

这段代码可以工作并向我的JMS队列发送许多消息(通过NumberOfThreads和NumberOfMessagesPerThread)。 但是,我不相信它确实是multithreading的。 例如,如果我将线程设置为10并将消息设置为100(总共1000条消息),则每个线程需要100个线程和10条消息。 即使下面的代码也需要相同的时间。

  for (int i = 0; i < 1000; i ++) { sendMessage("Hello"); } 

我正在做线程吗? 我希望multithreading代码比简单的for循环快得多。

您是否跨所有线程共享单个连接(单个生产者)? 如果是这样,那么你可能会在那里遇到一些线程争用,并且你只能限制你的生产者和你的经纪人之间的套接字连接的速度。 当然,它将在很大程度上取决于您正在使用的jms实现(如果您使用的是asyncSends)。

我建议你使用完全独立的生成器来重复测试(尽管你会在消息排序方面失去“队列”语义,但我想这是预期的)。

此外,我不建议运行性能测试,其数字如此高,如100线程。 请记住,您的multithreadingfunction在某种程度上受到您加工的内核数量的限制(或多或少,您在此处也有很多IO,因此可能有助于拥有比内核更多的线程,但是100是在我看来,这不是一个很好的数字)

我还将回顾一下这篇文章中的一些评论单对multithreadingJMS生产者

‘sendMessage’的实现是什么? 如何重用连接,会话和生成器?