在通过网络传输文件时使用ThreadPoolTask​​Executor

时间:2013-09-25 07:04:29

标签: java spring spring-batch

我目前正在编写一个弹簧批,它应该将我的应用程序中的所有文件传输到共享位置。批处理包含一个步骤,其中包括读取byte []的读取器,将其转换为pdf的处理器以及在共享位置创建新文件的编写器。

1)由于它的IO绑定操作应该在我的批处理中使用ThreadPoolTask​​Executor吗?使用它会导致数据丢失吗?

2)同样在我的ItemWriter中,我正在使用FileOutputStream编写。我的服务器在巴黎,共享位置在纽约。因此,在这种情况下编写文件时,有没有更好或更有效的方法来实现这一目标,最少延迟?

提前致谢

2 个答案:

答案 0 :(得分:0)

1)如果你可以将IO绑定操作分离到自己的线程和其他部分到自己的线程中,你可以采用多线程方法。如果写得正确,数据不会丢失。 一种方法可以如下:

  • 让一个读者线程将数据读入缓冲区。
  • 让第二个线程执行转换为PDF。
  • 让第三个线程执行写出(如果它不相同的话) 磁盘作为阅读)。

2)所以这是一个映射的网络共享?那时你可以用Java做的事情不多。但在你担心它之前,你应该确保它是一个实际问题而不是过早优化。

答案 1 :(得分:0)

我猜你可以通过分区来完成上述任务。使用两种方法创建主步骤,使用多线程返回文件路径和从属任务。

  1. 简单的tasklet,它将读取文件/转换为pdf并写入共享驱动器。

    而不是使用FileOutputStream将FileChannel与BufferedRead / Write一起使用,它具有更好的性能

  2. 使用Chunk Reader特别是ItemStream并将其传递给自定义ItemWriter以写入文件(从未有机会写入pdf,但我相信在一天结束时它将是一个具有不同编码的流​​)
  3. 我建议第二个,它总是更好地使用lib而不是使用自定义代码