2015-01-15 2 views
1

Я считаю, что можно установить контекст Log4j (SL4J) MDC в потокобезопасная образом в общем фильтр (код из http://blog.trifork.com/2013/06/06/adding-user-info-to-log-entries-in-a-multi-user-app-using-mapped-diagnostic-context/)Log4j (SLF4J) MDC Контекст в Struts 2 перехватчик

import org.slf4j.MDC; 
import javax.servlet.*; 
import java.io.IOException; 

public class MDCFilter implements Filter { 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) 
      throws IOException, ServletException { 
     User user= (User) session.getAttribute("USerSession"); 
     MDC.put("userName", user.getUserName()); 
    try { 
     chain.doFilter(req, resp); 
    } finally { 
     MDC.remove("userName"); 
    } 
    } 

} 

Может Я делаю тот же подход в перехватчике Struts 2!! Я задаюсь вопросом о проблемах, связанных с потоками.

Фильтры перехватчиков и сервлетов Struts 2 не являются поточно-защищенными, а реализация MDC является потокобезопасной, поэтому, если вышеприведенный код работает нормально в фильтре, теоретически он должен быть защищен рабочей резьбой в перехватчике.

Любые комментарии?!

ответ

1

Перехватчики не являются потокобезопасными, значит, вы должны написать их в потоковом безопасном режиме. Например, нижеперехватчик является потокобезопасным.

public class LoggerInterceptor extends AbstractInterceptor { 
    @Override 
    public String intercept(ActionInvocation invocation) throws Exception { 
    HttpSession session = ServletActionContext.getRequest().getSession(); 
    User user= (User) session.getAttribute("USerSession"); 
    MDC.put("userName", user.getUserName()); 
    String result; 
    try { 
     result = invocation.invoke(); 
    } finally { 
     MDC.remove("userName"); 
    } 
    return result; 
    } 
} 
Смежные вопросы