ファイルをアップロードして読み込もうとしていますが、すべてがうまくいきますが、ハンドラメソッドに@Async
注釈を付けるとうまくいきません。スプリング非同期ファイルのアップロードと処理
私は、ユーザーがファイルを処理するまで待つことを望んでいません。しかし、この注釈を入れた後、私はjava.lang.IllegalStateException: File has been moved - cannot be read again
例外を得る。何が起こり、これをどうやって修正するのですか?私が理解しているように、要求応答が終了し、それをクリーンアップするので、Springは単にファイルをクリアすることができます。しかし、これを防ぐべきではない@Async
?
サンプル春ブートアプリケーション:
@SpringBootApplication
@EnableSwagger2
@ComponentScan(value = "hello")
@EnableAsync
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.regex("/api/.*"))
.build();
}
}
アップロードコントローラ:
@RestController
@RequestMapping(value = "/files")
public class FilesController {
@Inject
private Upload upload;
@RequestMapping(method = RequestMethod.POST)
public void addSource(@RequestParam MultipartFile file) throws IOException, InterruptedException {
upload.process(file);
}
}
アップロードサービス:
@Component
public class Upload {
@Async
public void process(MultipartFile file) throws InterruptedException, IOException {
sleep(2000);
System.out.println(new String(IOUtils.readFully(file.getInputStream(), -1, false)));
}
}
そして今、私はjava.io.FileNotFoundException
を取得します。私はここで何が欠けているのか分からない。おそらく、私はこれに何か誤りが見つからないので、何か間違っていると思います。これは非常に一般的なユースケースだと思います。
ファイルをアップロードするときにポストリクエストを送信するのか、それともajaxリクエストを行いますか? –
さらに、サービスメソッドまたはコントローラで@Asyncアノテーションを使用しましたか? –
シンプルなPOSTリクエストです(スワッガー経由)。 @Asyncアノテーションをサービスメソッドに配置します。 – bargoras