有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在通过网络传输文件时使用ThreadPoolTaskExecutor

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

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

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

提前谢谢


共 (2) 个答案

  1. # 1 楼答案

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

    • 让一个读卡器线程将数据读入缓冲区
    • 让另一个线程执行到PDF的转换
    • 让第三个线程执行写操作(如果不相同) 磁盘作为读取)

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

  2. # 2 楼答案

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

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

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

    2. 使用Chunk Reader特别是ItemStream并将其传递给定制ItemWriter以写入文件(从未有机会写入pdf,但我相信最终它将是一个编码不同的流)

    我建议使用第二种,使用lib总是比使用自定义代码更好