Java 在Spring MVC中继续执行请求线程的事件驱动

Java 在Spring MVC中继续执行请求线程的事件驱动,java,spring,Java,Spring,控制器中有一个方法foo(),必须等待触发另一个方法bar()才能继续执行 @GetMapping("/foo") public void foo(){ doSomething(); // wait until method bar() triggered doAnotherSomething(); } @GetMapping("/bar") public void bar(){ //

控制器中有一个方法foo(),必须等待触发另一个方法bar()才能继续执行

    @GetMapping("/foo")
    public void foo(){
        doSomething();
        // wait until method bar() triggered
        doAnotherSomething();
    }   

    @GetMapping("/bar")
    public void bar(){
        // make foo() continue execute after being called
    }  
我的解决方案是:在数据库/缓存中保存状态标志,当foo()等待时,线程循环搜索状态是否更改。 但是,此解决方案将阻塞请求线程数秒。
有没有办法使foo()方法异步运行,从而不会阻止线程执行?

这个问题太广泛了。是,您可以稍后使用来完成web请求。但是
doAnotherSomething()
实际上应该异步执行,否则您仍然会使用线程,而不是应用服务器池中的线程。这将是一种浪费,因为您可以简单地增加应用程序服务器的池大小并完成它。将工作从它“卸载”到另一个池是一场白费力气的追逐

当您在单个线程中等待多个操作时,就可以实现真正的异步执行。例如,通过使用异步或通道,您可以一次读取多个文件/套接字。如果使用的是数据库,则数据库驱动程序必须支持异步执行

    @GetMapping("/foo")
    public void foo(){
        doSomething();
        // wait until method bar() triggered
        doAnotherSomething();
    }   

    @GetMapping("/bar")
    public void bar(){
        // make foo() continue execute after being called
    }  
下面是一个如何使用的示例:

@GetMapping(“/foo”)
public DeferredResult>res=新建DeferredResult();
doSomething();
做其他事情(res);
返回res;
}

void doAnotherSomething(DeferredResult您可以使用
CountDownLatch
等待相关方法的执行。为了简单起见,我使用了静态属性。确保两个方法都可以访问相同的
CountDownLatch
对象。
ThreadLocal
也可以用于此用例

private static CountDownLatch latch = new CountDownLatch(1);

@GetMapping("/foo")
public void foo(){
    doSomething();
    // wait until method bar() triggered
    latch.await();
    doAnotherSomething();
}   

@GetMapping("/bar")
public void bar(){
    // make foo() continue execute after being called
    latch.countDown();
} 

请查看此文档,了解SpringMVC异步支持创建异步方法的演示