spring mvc要求をインターセプトするために実装できるインターフェイスHandlerInterceptorAdapter
があります。 Springは抽象的な実装をHandlerInterceptorAdapter
に提供しています。拡張するだけで、必要なメソッドをオーバーライドできます。あなたの説明から、preHandle
とpostHandle
メソッドをオーバーライドするだけでよいようです。さらなる例については、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:は、コードにテストしていませんが、あなたは基本的なアイデアを得る必要があります。