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();
}
}
# 1 楼答案
结果表明,发布的代码没有问题。我正在处理的验证正在调用数据库。因为我有多个线程和多台机器对同一个数据库进行调用,所以性能显著降低。通过在每台机器上缓存所需的表修复了该问题
# 2 楼答案
消息传递在某种程度上已经是“天生”的
所以,试着删除多线程代码,并替换它
这两种方法都不需要在处理过程中管理(创建/同步)侦听器中的线程,因为消息到达时处理线程已经存在