2016-11-02 9 views
3

Springライブラリを使用して、メソッドの並行呼び出しの数を「抑制」することはできますか?同様に:すでに5つの他のスレッドがこのメソッドを実行している場合Springで同時呼び出しでメソッドを絞り込む方法は?

@RestController 
public class MyRest { 
    @RequestMethod 
    public void call() { 
     someLongRunningSyncTask(); 
     return "finished"; 
    } 

    public void someLongRunningSyncTask() { 

    } 
} 

だが、私はこの方法は、任意の実行(およびこれに残りのWebサービスの応答を)遅らせたいと仮定しましょう。

既にアノテーションやその他の抽象的なレイヤーがありますか?

答えて

1

spring mvc要求をインターセプトするために実装できるインターフェイスHandlerInterceptorAdapterがあります。 Springは抽象的な実装をHandlerInterceptorAdapterに提供しています。拡張するだけで、必要なメソッドをオーバーライドできます。あなたの説明から、preHandlepostHandleメソッドをオーバーライドするだけでよいようです。さらなる例については、this投稿をご覧ください。以下は、あなたが便利だと思うロック戦略が必要なものを達成する方法です。

public class CustomInterceptor extends HandlerInterceptorAdapter { 

    private final Semaphore semaphore; 
    private final long waitTime; 

    public CustomInterceptor() { 
     // Hardcode this values or inject through spring as preferred. 
     semaphore = new Semaphore(5); 
     waitTime = 10; 
    } 

    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
     try { 
      boolean acquired = semaphore.tryAcquire(1, waitTime, TimeUnit.SECONDS); 
      if (!acquired) { 
       //TODO Do something with the response or keep waiting or whatever 
      } 
     } catch (InterruptedException e) { 
      // Do something with this exception. Write custom message to response and then return false. 
      // TODO write custom message to response i.e interrupted or something 
      return false; 
     } 
     return super.preHandle(request, response, handler); 
    } 

    @Override 
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 
      ModelAndView modelAndView) throws Exception { 
     semaphore.release(); 
     super.postHandle(request, response, handler, modelAndView); 
    } 

} 

そしてばねXMLやJavaの設定でインスタンス化し、以下のようSimpleUrlHandlerMappingのインターセプタプロパティに注入します。

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
    <property name="mappings"> 
     <props> 
      <prop key="/welcome">welcomeController</prop> 
     </props> 
    </property> 
    <property name="interceptors"> 
     <list> 
      <ref bean="customInterceptor" /> 
     </list> 
    </property> 
</bean> 

<bean id="customInterceptor" class="com.common.mvc.interceptors.CustomInterceptor" /> 

PS:は、コードにテストしていませんが、あなたは基本的なアイデアを得る必要があります。

関連する問題