Message Queue性能下降

时间:2014-12-03 16:10:53

标签: java performance message-queue

我正在编写一个消息队列,但它运行缓慢,方法processFile花费了太多时间,并且文件长时间陷入队列。如何避免它。

    System.out.println("Message Reader Started....");
    do 
    {
        String directoryPath = "C:\\Queue";
        int fileCount = new File(directoryPath).list().length;
        if (fileCount < 1) {
            System.out.println("Files Not Present");
        }
        else
        {
            File[] file = new File(directoryPath).listFiles();
            String firstFile = file[0].getAbsolutePath();
            processFile(firstFile);             
        }                       
    } while (true);

3 个答案:

答案 0 :(得分:1)

你尝试过使用并发吗?它是并发处理的一个问题。假设文件处理是互斥的操作:

  • 主线程中的do while循环找到要读取的文件
  • 将流程文件委托给执行程序线程进行处理
  • 并且在处理之后(我假设正在读取文件)可以再次并行地处理内容。它就像读取前1000行并委托给要处理的线程一样。

您需要以更好的方式设计它以快速运行。单个线程读取和进程文件列表必然运行缓慢。

答案 1 :(得分:0)

您的主要问题可能是用于扫描文件夹的CPU使用情况。

你应该在循环结束时添加Thread.sleep(100);以给系统一些时间来呼吸。

您希望解决的问题显然是processFile()方法。您应该按照@Nazgul的评论进行操作,并使用Runnable接口在其自己的类中实现它。

要限制运行的线程数量,请将文件名放在List或Queue中,并在List上实现一个Thread。您可以添加系统可以处理的任意数量的工作线程。队列应该同步,以便您可以安全地同时从多个线程中删除项目。

答案 2 :(得分:0)

你写了一个无限循环,所以你为什么要担心单次迭代需要多长时间?

每次迭代都需要两次读取目录。假设您的processFile删除了已处理的文件(可能另一个线程或进程添加了一些文件,但删除了没有),则不需要在每次迭代中读取该目录。

阅读一次并处理找到的所有文件。如果没有,则重新读取目录。如果仍然没有,那么你可以终止或睡眠一段时间(或考虑watching目录,但这有点复杂,可能没有必要)。

我强烈建议您在开始使用踏板之前改善循环(然后按建议使用ExecutorService。)