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

时间:2014-09-25 12:00:07

标签: java multithreading 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)。但是,我不相信它真的是多线程的。例如,如果我将线程设置为10并将消息设置为100(总共1000条消息),则每个线程需要100个线程和10条消息。即使下面的代码也需要相同的时间。

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

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

2 个答案:

答案 0 :(得分:5)

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

我建议你使用完全独立的制作人重复你的测试(尽管你会丢失&#34;队列&#34;语义排序方式,但我猜这是预期的。)

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

答案 1 :(得分:1)

我还会回顾一下这篇文章Single vs Multi-threaded JMS Producer

中的一些评论

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