在 Spring Boot 的 DeferredResult REST 方法中使用 Semaphore 服务

Posted

技术标签:

【中文标题】在 Spring Boot 的 DeferredResult REST 方法中使用 Semaphore 服务【英文标题】:Using Semaphore in service inside a DeferredResult REST method in Spring Boot 【发布时间】:2016-02-04 09:19:36 【问题描述】:

我有一个代码,我尝试在我的 REST 控制器方法中使用 DeferredResult,我的服务使用异步方法并尝试使用 Semaphore 来限制该资源中的期货调用,当我使用 @Async semaphore.acquire( ) 抛出一个 InterruptedException,如果我直接在我的 REST 方法中调用我的信号量,acquire 方法永远不会返回,所以代码挂起,这是我的两种情况:

我的服务中的方法从我的控制器中的 DeferredResult REST 方法调用:

    @Async
    public void myAsyncMethod( DeferredResult<Boolean> result) throws InterruptedException,
            ExecutionException 
        processRunning.acquire(); // my semaphore (Throws InterruptedException: null)
        ... // long process using RxJava in a thread pool and a countdownLatch for wait
        result.setResult(true);
    

我的 DeferredResult 方法,我使用获取 InterruptedException 的 @Async 方法进行测试,然后我使用非异步方法进行测试并尝试使用信号量,但代码在 acquire() 方法中停止并且永远不会继续:

@RequestMapping(value = "/myRestMethod",
            method = RequestMethod.POST,
            produces = MediaType.APPLICATION_JSON_VALUE)
public DeferredResult<Boolean> asyncRESTMethod() throws InterruptedException, ExecutionException
        DeferredResult<Boolean> result = new DeferredResult<Boolean>();
            myService.getProcessRunning().acquire(); // getting the semaphore and try to acquire, the code hangs here and not continue

            Thread tr = new Thread(new Runnable() 

                @Override
                public void run() 
                    try 
                        myService.myMethod();
                        result.setResult(true);
                     catch (InterruptedException | ExecutionException e) 
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    
                
            );

            tr.start();
            tr.join();
        return result;
    

【问题讨论】:

【参考方案1】:

我找到了解决方案,问题是在我的代码的某些点我从我的信号量调用 tryAcquire 方法,该方法也获取信号量但返回真或假,所以当我再次尝试获取信号量时,信号量已经没有空了插槽,以便代码挂起或抛出 interruptedException。

【讨论】:

以上是关于在 Spring Boot 的 DeferredResult REST 方法中使用 Semaphore 服务的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot:管理的版本是 1.3.2.RELEASE 工件在 org.springframework.boot:spring-boot-dependencies:1.3.2.RELEASE

无法构建 Spring-boot-sample-gae(在 GAE 上部署 Spring Boot)

如何在 spring-boot 中禁用 spring-data-mongodb 自动配置

spring boot学习02如何在spring boot项目中访问jsp

spring-boot实战12:Spring Boot中使用JavaMailSender发送邮件

Spring Boot:Spring Boot 如何测试打包部署