Java activeMQ生产者在发送消息时花费了很长时间

Java activeMQ生产者在发送消息时花费了很长时间,java,activemq,threadpool,Java,Activemq,Threadpool,我已经编写了一个producer应用程序,它通过在activeMQ中使用Executer服务将JMS消息排队,它工作得很好,但问题是将消息排队需要很长时间 有三个文件: 1.ExecutePushServer.java 2.ActiveMQProducer.java 3.SendPush.java package com.rh.pushserver; public class SendPush implements Runnable { /** * @uthor ankit */ p

我已经编写了一个producer应用程序,它通过在activeMQ中使用Executer服务将JMS消息排队,它工作得很好,但问题是将消息排队需要很长时间

有三个文件: 1.ExecutePushServer.java 2.ActiveMQProducer.java 3.SendPush.java

package com.rh.pushserver;



public class SendPush implements Runnable {
/**
 * @uthor ankit
 */

private String id;
private ActiveMQProducer mqProducer;


public SendPush(ActiveMQProducer mqProducer,String id) {

    this.id=id;
    this.mqProducer=mqProducer;
}

@Override
public void run() {

    mqProducer.enqueueMessage(id);
}

}
ExecutePushServer.java:

package com.rh.pushserver;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import org.apache.log4j.Logger;

public class ExecutePushServer {

/**
 * @uthor ankit
 */

static int maxThread = 0;
static BufferedReader br = null;
static String fileLocation = null;
static List<String> tokenList = new ArrayList<String>();
private static String txt;
static Properties configFile = new Properties();
private final static Logger logger = Logger
        .getLogger(ExecutePushServer.class.getName());

public static void main(String[] args) {
    // TODO Auto-generated method stub
    try {
        configFile.load(ExecutePushServer.class.getClassLoader()
                .getResourceAsStream("config.properties"));
        maxThread = Integer.valueOf(configFile.getProperty("POOL_SIZE"));

        fileLocation = configFile.getProperty("LOCATION");

        txt = configFile.getProperty("txt");
        logger.info("Message text is : " + txt);

        br = new BufferedReader(new FileReader(fileLocation));

        ActiveMQProducer mqProducer = new ActiveMQProducer();

        tokenList = getList(br);
        logger.info("tokenList created.");


        ExecutorService executor = Executors.newFixedThreadPool(maxThread);
        for (String id : tokenList) {
            Runnable work = new SendPush(mqProducer, id);
            executor.execute(work);
        }

        // This will make the executor accept no new threads
        // and finish all existing threads in the queue
        logger.info("All Ids Entered in Pool.");
        executor.shutdown();

        while (!executor.awaitTermination(10, TimeUnit.MINUTES)) {
            logger.info("Inside awaitTermination");
        }

        mqProducer.closeConnection();

    } catch (IOException e) {
        logger.error("Error in Reading File" + e);

    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        logger.error("Error in termination of executer" + e);
    } finally {
        try {
            if (br != null)
                br.close();

        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

}

private static List<String> getList(BufferedReader br) {
    // TODO Auto-generated method stub
    String currentLine;
    try {
    while ((currentLine = br.readLine()) != null) {
        tokenList.add(currentLine);
    }

    return tokenList;

    } catch (IOException e) {
        logger.error("Error occured in creating tokenList !" + e);
        return null;
    } 
}

}
}

SendPush.java

package com.rh.pushserver;



public class SendPush implements Runnable {
/**
 * @uthor ankit
 */

private String id;
private ActiveMQProducer mqProducer;


public SendPush(ActiveMQProducer mqProducer,String id) {

    this.id=id;
    this.mqProducer=mqProducer;
}

@Override
public void run() {

    mqProducer.enqueueMessage(id);
}

}

请帮帮我

我首先要看的是你的线程使用情况;您正在为每条消息创建一个新线程,这肯定是您的性能没有更快的一个重要原因。为什么你不能让你的线程运行一个循环来发送消息,直到它们发送的消息用完,然后让N个线程来分割工作

您可能还希望在单独的线程中运行读卡器逻辑,在该线程中,读卡器以尽可能快的速度读取文件,并将它读取的内容传递给线程,这样您就不必等待文件被读取时才开始。确保用于在读卡器线程和消息线程之间传递数据的数据结构是线程安全的


一旦您这样做了,如果速度不是您想要的,请查看代理的配置。(如果你想让别人看,就把它贴在这里。)特别是,如果你的消息是持久的,那么看看它们被持久化的地方,看看是否还有其他更快的选择。(JDBC存储通常是最慢的持久性选项,所以考虑其他选项。)或者甚至可以使消息不持久,使它们更快;你必须决定你是否能接受这种权衡。弄清楚消息是异步传递还是同步传递;如果是同步,您可能希望启用异步。并确保生产者流控制没有启动(检查代理日志);如果是这样的话,那么你的消费者可能太慢了,让你的制作人慢了下来。

每条消息排队都要花很长时间吗?第一条信息的发送时间是第一百条还是第一千条?你到底发送了多少条信息?看起来您每封邮件使用一个线程,这听起来比我想要的开销要大,但是如果您只发送几封邮件,那么这可能不是问题。我一次发送大约50万封邮件,事实上需要两个多小时才能停止此过程。感谢Tim的关注!!120分钟内发送500000条消息,即每秒发送70条消息。这很慢,但从你的问题描述来看,我假设我们每10秒就说一条信息;这是一个非常不同的数量级(也是一个非常不同的问题)。