在 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