Próbuję przesłać plik, a następnie go odczytać, wszystko działa poprawnie, ale nie po umieszczeniu adnotacji @Async
w metodzie programu obsługi.Przesyłanie i przetwarzanie wiosennego pliku asynchronicznego
Nie chcę, aby użytkownik czekał, dopóki nie przetworzy pliku. Ale po umieszczeniu tej adnotacji otrzymuję wyjątek java.lang.IllegalStateException: File has been moved - cannot be read again
. Co się dzieje i jak to naprawić? Jak rozumiem, Spring może po prostu wyczyścić plik, ponieważ żądanie-odpowiedź kończy się i czyści to. Ale czy nie powinno to przeszkodzić?
Przykładowa aplikacja Wiosna Boot:
@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();
}
}
Prześlij kontroler:
@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);
}
}
Załaduj usługi:
@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)));
}
}
A teraz mam java.io.FileNotFoundException
. Nie jestem pewien, czego tu brakuje. Prawdopodobnie robię coś złego, ponieważ nie mogłem znaleźć żadnego błędu i uważam, że jest to bardzo powszechny przypadek użycia.
Czy tworzysz prośbę o wpis lub czy wysyłasz plik z zapytaniem o ajax? –
Czy używałeś również adnotacji @Sync w metodzie usługi lub w kontrolerze? –
Jest to proste żądanie POST (poprzez zboczenie). Wpisuję adnotację @Aync do metody serwisowej. – bargoras