Heim  >  Artikel  >  Java  >  Benutzerdefinierte Java-Filter und Interceptoren implementieren ThreadLocal-Thread-Schließung

Benutzerdefinierte Java-Filter und Interceptoren implementieren ThreadLocal-Thread-Schließung

WBOY
WBOYnach vorne
2023-05-15 23:40:05945Durchsuche

Thread-Schließung

Thread-Schließung verwendet im Allgemeinen die folgenden drei Methoden:

  • Ad-hoc-Thread-Schließung: Programmsteuerungsimplementierung, schlimmstenfalls ignorieren

  • Stack-Schließung: lokale Variablen, keine Parallelitätsprobleme

  • ThreadLocal-Thread-Schließung: Eine besonders gute Abschlussmethode

Methode 2 wird am häufigsten verwendet. In diesem Artikel wird hauptsächlich Methode 3 erläutert. Das SpringBoot-Projekt implementiert ThreadLocal-Thread-Schließung durch benutzerdefinierte Filter und Interceptoren. Implementieren Sie den benutzerdefinierten Filter der Filterschnittstelle und erben Sie den benutzerdefinierten Interceptor HandlerInterceptorAdapter.

ThreadLocal thread closure implementation steps

Method of encapsulating ThredLocal

/**
 * <p>自定义RequestHolder</p></p>
 *
 * @Author zjq
 * @Date 2021/12
 */
public class RequestHolder {

    private final static ThreadLocal<Long> requestHolder = new ThreadLocal<>();

    public static void set(Long id) {
        requestHolder.set(id);
    }

    public static Long get() {
        return requestHolder.get();
    }

    public static void remove() {
        requestHolder.remove();
    }

}

Customized filter

Customized interceptor inherits the Filter interface and implements the ThredLocal.add() method

/**
 * <p>自定义过滤器</p>
 *
 * @Author zjq
 * @Date 2021/12/7
 */
@Slf4j
public class HttpFilter implements Filter {

    /**
     * 为Filter初始化 提供支持
     *
     * @param filterConfig
     * @throws ServletException
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    /**
     * 拦截到要执行的请求时,doFilter就会执行。这里我们可以写对请求和响应的预处理。
     * FilterChain把请求和响应传递给下一个 Filter处理
     *
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //把普通servlet强转成httpServlet
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        Long threadId = Thread.currentThread().getId();
        log.info("do filter,threadId:{} servletPath:{}", threadId, httpServletRequest.getServletPath());
        //把当前线程id放入requestHolder
        RequestHolder.set(threadId);
        //放行
        filterChain.doFilter(httpServletRequest, servletResponse);
    }

    /**
     * Filter 实例销毁前的准备工作
     */
    @Override
    public void destroy() {

    }
}

Customized interceptor

Customized interception The controller removes the contents of ThredLocal, nachdem der Thread verwendet wurde, um einen Speicherüberlauf zu vermeiden /threadLocal/test, die Konsolenausgabe lautet wie folgt:

Das obige ist der detaillierte Inhalt vonBenutzerdefinierte Java-Filter und Interceptoren implementieren ThreadLocal-Thread-Schließung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen