package net.ameba.cassandra.web.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.ameba.cassandra.web.service.CassandraClientProvider;
import org.apache.cassandra.thrift.Cassandra.Client;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* {@link CassandraClientInterceptor} intercepts requests to prevent leaking client connection.
*/
public class CassandraClientInterceptor implements HandlerInterceptor {
@Autowired
private CassandraClientProvider clientProvider;
public CassandraClientInterceptor() {
}
@Override
public void afterCompletion(
HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception exception)
throws Exception {
}
@Override
public void postHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView mav) throws Exception {
// If client has thrift client, closing it.
if (clientProvider.hasThriftClient()) {
Client client = clientProvider.getThriftClient();
// closing transports
client.getInputProtocol().getTransport().close();
client.getOutputProtocol().getTransport().close();
// clean up provider
clientProvider.clean();
}
}
@Override
public boolean preHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
return true;
}
}