JAvaバックエンド処理高同時
4562 ワード
1つのログインページが多くのアカウントに同時にログインしたり登録されたりする可能性があります。そうしないと、プログラムの使用率を下げたり、プログラムが潰れたりします。次のコード処理プログラムの高同時効果は悪くありません。
/**
*@author xiaoxie
*@date create 2019/9/17
*@return
*
*/
public class RequestHolder {
//
private static final ThreadLocal userHolder = new ThreadLocal();
//
private static final ThreadLocal requestHolder = new ThreadLocal();
//
public static void add(SysUser sysUser){
userHolder.set(sysUser);
}
public static void add(HttpServletRequest request) {
requestHolder.set(request);
}
//
public static SysUser getCurrentUser() {
return userHolder.get();
}
//
public static HttpServletRequest getCurrentRequest() {
return requestHolder.get();
}
//
public static void remove(){
userHolder.remove();
requestHolder.remove();
}
}
注意:SysUserは自分で定義したモデルで、自分の必要に応じて設定します.
ログインまたは登録が完了すると消滅します。そうしないと、データのオーバーフローが発生します。
/**
*@author xiaoxie
*@date CREATE 2019/9/6 UPDATE 2019/9/12
*@return
*/
@Slf4j
public class HttpInterceptor extends HandlerInterceptorAdapter {
private static final String START_TIME = "requestStartTime";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String url = request.getRequestURI().toString();
Map parameterMap = request.getParameterMap();
log.info("request start. url:{}, params:{}", url, JsonMapper.obj2String(parameterMap));
long start = System.currentTimeMillis();
request.setAttribute(START_TIME, start);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// String url = request.getRequestURI().toString();
// long start = (Long) request.getAttribute(START_TIME);
// long end = System.currentTimeMillis();
// log.info("request finished. url:{}, cost:{}", url, end - start);
removeThreadLocalInfo();
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
String url = request.getRequestURI().toString();
long start = (Long) request.getAttribute(START_TIME);
long end = System.currentTimeMillis();
log.info("request completed. url:{}, cost:{}", url, end - start);
removeThreadLocalInfo();
}
public void removeThreadLocalInfo() {
RequestHolder.remove();
}
フィルタによる実装
/**
*@author xiaoxie
*@date create 2019/9/17
*@return
*
*
*/
@Slf4j
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
SysUser sysUser = (SysUser) req.getSession().getAttribute("user");
if (sysUser == null){
String path = "/signin.jsp";
resp.sendRedirect(path);
return;
}
//
RequestHolder.add(sysUser);
RequestHolder.add(req);
filterChain.doFilter(servletRequest,servletResponse);
return;
}
@Override
public void destroy() {
}
}
簡単な高同時処理で済みました.