Sto tentando di caricare il file e quindi leggerlo, tutto funziona correttamente, ma non quando ho inserito l'annotazione @Async
nel metodo del gestore.Caricamento ed elaborazione di file asincroni di primavera
Non voglio che l'utente continui ad aspettare finché non elabora il file. Ma dopo aver inserito questa annotazione ottengo l'eccezione java.lang.IllegalStateException: File has been moved - cannot be read again
. Cosa succede e come posso risolvere questo problema? Come ho capito, Spring potrebbe semplicemente cancellare il file perché termina la richiesta-risposta e la ripulisce. Ma non dovrebbe impedirlo @Async
?
Esempio di applicazione Primavera 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();
}
}
Upload Controller:
@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);
}
}
Upload servizio:
@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)));
}
}
Ed ora ho java.io.FileNotFoundException
. Non sono sicuro di cosa mi manchi qui. Probabilmente sto facendo qualcosa di sbagliato in quanto non sono riuscito a trovare alcun errore su questo aspetto e penso che questo sia un caso d'uso molto comune.
Si effettua una richiesta di posta o si effettua una richiesta Ajax quando si carica il file? –
Inoltre, hai usato l'annotazione @Async nel metodo di servizio o nel controller? –
È una semplice richiesta POST (tramite swagger). Ho inserito l'annotazione @Async sul metodo di servizio. – bargoras