Java:将消息发送到具有多个线程的 JMS 队列

标签 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 循环快得多。

最佳答案

您是否在所有线程之间共享一个连接(一个生产者)?如果是这样,那么您可能在那里遇到了一些线程争用,并且您的生产者和代理之间的套接字连接速度受到限制。当然,这在很大程度上取决于您使用的 jms 实现(以及您是否使用 asyncSends)。

我会建议您使用完全独立的生产者重复您的测试(虽然,您将失去消息排序方面的“队列”语义,但我想这是预料之中的)。

此外,我不建议使用 100 个线程这样高的数量运行性能测试。请记住,您的多线程功能在某些时候会受到您机器拥有的内核数量的限制(或多或少,您在这里也有很多 IO,因此拥有比内核多一些的线程可能会有所帮助,但是 100 是在我看来这不是一个很好的数字)

关于Java:将消息发送到具有多个线程的 JMS 队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26038118/

相关文章:

java - Java 中的色度键效果

java - 创建 HttpsSession 时如何更改 DefaultSessionTrackingModes

具有线程执行的 Java 套接字

c# - 为什么 Apache ActiveMQ 不适合 .NET 开发人员?

java - JMS回滚有多可靠?

java - DefaultMessageListenerContainer 不缩放

java - Springboot -> Springboot 2 : 2 Spring WebApplicationInitializers detected on classpath

.net - 同步上下文的切换是否意味着工作将在拥有同步上下文的线程上运行?

c# - 如何在Orchard Modules中实现多线程?

java - 浏览器下载完成事件