【问题标题】:Message Queue slow performance消息队列性能缓慢
【发布时间】:2015-02-01 07:02:45
【问题描述】:

我正在编写一个消息队列,但它运行缓慢,方法 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);

【问题讨论】:

  • listFiles() 没有保证顺序,您可能正在读取尚未完全写入的文件。我建议您阅读所有文件(不仅仅是“第一个”文件),只处理那些 10 或 60 秒未更新的文件。
  • 不错的小费感谢@PeterLawrey

标签: java performance message-queue


【解决方案1】:

您是否尝试过为此使用并发?它是并发处理的合适问题。假设文件处理是一个互斥的动作:

  • 主线程中的 do while 循环找到要读取的文件
  • 进程文件被委托给一个执行线程进行处理
  • 处理后(我假设读取文件)内容的处理可以再次并行完成。这就像读取前 1000 行并委托给一个线程进行处理。

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

【讨论】:

  • 我想到了,但后来我认为为每个文件创建一个新线程会很混乱且难以管理。你有什么好的材料来阅读它吗?
  • 了解执行器服务。这会帮助你。你不需要自己创建线程。
【解决方案2】:

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

您应该在循环的末尾添加Thread.sleep(100);,让系统有一些喘息的时间。

您要解决的问题显然是processFile() 方法。你应该按照@Nazgul 的评论去做,并在它自己的类中使用 Runnable 接口实现它。

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-12-28
      • 2020-03-24
      • 2011-10-11
      • 2017-01-03
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 2021-10-20
      • 2021-05-18
      相关资源
      最近更新 更多