0

我目前正在编写一个春季批处理,它应该将所有文件从我的应用程序传输到共享位置。该批处理由一个步骤组成,该步骤由一个读取字节 [] 的读取器、一个将其转换为 pdf 的处理器和一个在共享位置创建新文件的写入器组成。

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

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

提前致谢

4

2 回答 2

0

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

  • 让一个阅读器线程将数据读入缓冲区。
  • 让第二个线程执行转换为 PDF。
  • 让第三个线程执行写出(如果它与读取不在同一个磁盘上)。

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

于 2013-09-25T08:07:13.553 回答
0

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

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

    与使用 FileOutputStream 相比,使用 FileChannel 和 BufferedRead/Write 它具有更好的性能

  2. 专门使用 Chunk Reader ItemStream 并将其传递给自定义 ItemWriter 以写入文件(从来没有机会写入 pdf,但我相信最终它将是一个具有不同编码的流​​)

我会推荐第二个,使用 lib 而不是使用自定义代码总是更好

于 2013-09-25T20:00:17.183 回答