有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么在不同的CPU上运行两个队列侦听器比运行一个要花更长的时间?

我有2个程序和3个CPU。一个是做两件事的程序。首先,它向JMS队列(XMLQueue)发送大约60k条消息。它所做的第二件事是侦听不同的JMS队列(ResultQueue),提取返回的数据并对其进行处理。该程序在CPU 1上运行

第二个程序是验证程序。它从XMLQueue接收消息,进行一些验证,然后将结果发送给ResultQueue。每次该程序接收到一条新消息时,它都会在不同的线程中处理该消息(一次运行的线程数量最多)。如果最大值正在运行,它会在收到新消息之前等待一个消息死亡。为了提高性能,我尝试在2个CPU上运行这个程序,计算如果每个CPU完成一半的工作,它应该将总处理时间从大约3小时减少到1.5小时,如果在3台或4台机器上运行,甚至更少

我的问题是,当验证程序只在一个CPU上运行时,大约需要200秒来处理1000条消息。当我添加第二个CPU时,需要500秒!!我想当我使用更多的内存和处理器来完成这项工作时,我对队列的某些方面没有正确的理解。有什么想法吗

下面是完成侦听的代码。会话设置为自动确认

public void listen() {
    if(closed){
        throw new IllegalStateException("cannot listen to a closed connection");
    }
    try{
        boolean listening=true;
        while(listening){
            Message msg = mc.receive();
            System.out.println("Received message " + ++count );
            if (msg instanceof TextMessage){
                TextMessage tmsg = (TextMessage) msg;
                String xml = tmsg.getText();

                DataParser parser = new XmlParser("paths.properties");

                synchronized(tm){
                    while(tm.isFull()){
                        try{

                            tm.wait();

                        }catch(InterruptedException e){
                            e.printStackTrace();
                        }
                    }
                    new Executor(xml, tm,parser,responder);
                    tm.notifyAll();
                }
            }
            else if (msg instanceof ObjectMessage){
                closeConnection();
                closed = true;
                listening=false;
            }
        }
    }catch(Exception e){
        e.printStackTrace();
    }


}

共 (2) 个答案

  1. # 1 楼答案

    结果表明,发布的代码没有问题。我正在处理的验证正在调用数据库。因为我有多个线程和多台机器对同一个数据库进行调用,所以性能显著降低。通过在每台机器上缓存所需的表修复了该问题

  2. # 2 楼答案

    消息传递在某种程度上已经是“天生”的

    所以,试着删除多线程代码,并替换它

    • 使用多个程序实例,在队列上使用一个简单的侦听器
    • 一个程序使用多个线程。同样,每个线程都会监听队列。你的方法的不同之处在于,前面有多个听众

    这两种方法都不需要在处理过程中管理(创建/同步)侦听器中的线程,因为消息到达时处理线程已经存在