java - 如何在 Spring Boot 中创建部分异步发布请求?

标签 java spring-boot http-post

我是 Spring Boot 的新手,我想创建一种异步请求。它应该允许用户上传文件。然后 Spring 应用程序应该保存它并回答用户文件已正确保存。

然后整个异步部分发生了。服务器应该在保存文件后立即开始处理文件(在后台)。目前,它不在后台运行(用户需要等到 processFileInBackground 完成):

Controller :

@CrossOrigin
@RestController
public class ProcessFileController {
    @Autowired
    ProcessFileService processFileService;

    @CrossOrigin
    @PostMapping("/files/upload")
    public ResponseEntity<String> singleFileUpload(@RequestParam("file") MultipartFile file) {
        System.out.println("singleFileUpload tid: " + Thread.currentThread().getId());
        bytes = file.getBytes();
        // Save file...
        String plainText = new String(bytes, StandardCharsets.UTF_8);
        processFileInBackground(plainText);
        return new ResponseEntity<>("File successfully uploaded!", HttpStatus.OK);
    }


    private void processFileInBackground(String plainText) {
        processFileService = new ProcessFileService(plainText);
        String result = processFileService.getResult();
    }
}

服务:

@Service
public class ProcessFileService {

    private FileProcessor fileProcessor;

    public CompilerApiService(String plainText){
        fileProcessor = new FileProcessor(code);
    }

    @Async
    public String getResult(){
        System.out.println("getResult tid: " + Thread.currentThread().getId());
        // The call below takes a long time to finish
       return fileProcessor.getResult();
    }

}

配置:

@EnableAsync
@Configuration
public class AsyncConfig {
    @Bean
    public Executor threadPoolTaskExecutor() {
        return new ConcurrentTaskExecutor(Executors.newCachedThreadPool());
    }
}

最佳答案

Spring 为您提供了@Async 注解,您需要将您的异步逻辑分离到一个单独的类中,并用这个异步注解您的方法,这将在一个单独的线程中执行您的逻辑。 检查这个https://spring.io/guides/gs/async-method/

请注意,您必须从调用者类外部调用异步方法才能在异步模式下执行,就像这样

@CrossOrigin
@RestController
public class ProcessFileController {
    @Autowired
    ProcessFileService processFileService;

    @CrossOrigin
    @PostMapping("/files/upload")
    public ResponseEntity<String> singleFileUpload(@RequestParam("file") MultipartFile file) {
        bytes = file.getBytes();
        // Save file...
        String plainText = new String(bytes, StandardCharsets.UTF_8);
        processFileInBackground(plainText);
        return new ResponseEntity<>("File successfully uploaded!", HttpStatus.OK);
    }


    private void processFileInBackground(String plainText) {
        processFileService = new ProcessFileService(plainText);
        String result = processFileService.getResult();
    }
}

服务

@Service
public class ProcessFileService {

    private FileProcessor fileProcessor;

    public CompilerApiService(String plainText){
        fileProcessor = new FileProcessor(code);
    }

    @Async
    public String getResult(){
       return fileProcessor.getResult();
    }

}

配置

@EnableAsync
@Configuration
public class AsyncConfig {
    @Bean(name = "threadPoolExecutor")
    public Executor getAsyncExecutor() {
      ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
      executor.setCorePoolSize(7);
      executor.setMaxPoolSize(42);
      executor.setQueueCapacity(11);
      executor.setThreadNamePrefix("threadPoolExecutor-");
      executor.initialize();
      return executor;
    }
}

关于java - 如何在 Spring Boot 中创建部分异步发布请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56102850/

相关文章:

java - Hibernate如果@NotFound,插入数据库

java - 我正在尝试在 ant 文件中使用 SASS,同时删除 ruby​​ 依赖项

java - 当类路径包含许多目录时,类路径根是什么意思?

java - Android (Java) JSON 被发送到服务器,但里面的数据不是 "seeing",而是对象的 toString

android - HttpResponse 响应 = httpclient.execute(httppost);即使使用 ASYNCTASK 也不能在 Android 4 中工作

java - int[] 与 ArrayList<>() 在 Java 中的内存、动态编程中的比较

java - DefaultJmsListenerContainerFactory - 并发 - 每个队列的线程数在什么时候开始增加?

java - Apache Camel 在使用quartz 调度程序调度 ftp 端点时抛出 java.lang.NullPointerException

c# - Request.Content.IsMimeMultipartContent() 失败

TreeView 上 TreeItems 的 JavaFX 优化异步延迟加载