`

ThreadLocal+AOP记录参数

    博客分类:
  • JAVA
 
阅读更多

有些参数想在日志中显示,但是不想在方法中处理,就想根据线程保存起来,然后从action向下面传递的时候不需要再处理此参数。

首先写个使用threadlocal保存参数的工具类

 

public class LogThreadLocal {
    private static Logger log = Logger.getLogger(LogThreadLocal.class);
    private static final ThreadLocal threadParam = new ThreadLocal();

    public static void getParam(HashMap... paramMap) {
        InParam s = (InParam) threadParam.get();
        try {
            if (s == null && paramMap.length == 1) {
                s = new InParam(Thread.currentThread().getName(),paramMap[0].get(BaseConstant.SQ_ID).toString(),paramMap[0]);
                threadParam.set(s);
                log.info("threadLocal is null , SQ_ID =  " + paramMap[0].toString());
            } else if (s != null) {
                if (s.getSQ_ID() == null ) {
                    log.error("thread name ="+Thread.currentThread().getName()+" log SQ_ID  is null ");
                }else if (paramMap[0].get(BaseConstant.SQ_ID)==null){
                    log.info("thread name ="+Thread.currentThread().getName()+" log SQ_ID  is  " + s.getSQ_ID());
                }else {
                    s = new InParam(Thread.currentThread().getName(),paramMap[0].get(BaseConstant.SQ_ID).toString(), paramMap[0]);
                    log.info("new thread param =  thread name =" + Thread.currentThread().getName()+"SQ_ID = "+paramMap[0].get(BaseConstant.SQ_ID).toString());
                    threadParam.set(s);
                }

            } else {
                log.error("s == null and paramMap.length()= " + paramMap.length);
            }
        } catch (Exception ex) {
            log.error("Medthod:getParam  error", ex);
        }
    }
}

 

然后写个AOP的类

 

 public Object invoke(MethodInvocation methodInvocation) throws Throwable {
        long procTime = System.currentTimeMillis();
        try {
//            LogThreadLocal.getParam();
            Object[] args = methodInvocation.getArguments();
            System.out.println("args = "+ Arrays.toString(args));
            HashMap<String, String> tempMap = new HashMap<String, String>();
             for(Object o : args){

                 log.info("o="+o.toString());
                 if(o.toString().contains("$")){
//                     Map tempMap = new HashMap();
                     tempMap.put(BaseConstant.SQ_ID,o.toString());
                 }
                 if(o instanceof User){
                     User tempUser = (User)o;
                     tempMap.put("email",tempUser.getEmail());
                     tempMap.put("pwd",tempUser.getPwd());
                 }
             }
            LogThreadLocal.getParam(tempMap);
            return methodInvocation.proceed();
        }catch (Exception e){
            log.error("error ",e);
        }
        finally {
            log.info(getMsg(methodInvocation, procTime));
            return methodInvocation.proceed();
        }
    }
 

在spring中配置

 

 <bean id="logAop" class="com.easy.todo.util.LogAop"/>
    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
        <property name="beanNames">
            <value>*Dao,*Service,*Manager</value>
        </property>
        <property name="interceptorNames">
            <list>
                <value>logAop</value>
            </list>
        </property>
    </bean>

 然后写方法进行测试

 

 public static void main(String[] args) {
        ExecutorService exec = Executors.newCachedThreadPool();
        final Semaphore semp = new Semaphore(thread_num);
        for (int index = 0; index < client_num; index++) {
            final int NO = index;
            Runnable run = new Runnable() {
                public void run() {
                    try {
                        //http://localhost:8080/login/reg_register.action?email=ztrea@si.com&pwd=111&SQ_ID=3123
                        semp.acquire();
                        System.out.println("Thread:" + NO);
                        String host = "http://localhost:8080/login/reg_register.action?";
                        String para = "email=ztrea@si.com&pwd=111&SQ_ID=$" + Math.random();
                        System.out.println(host + para);
                        URL url = new URL(host);// 此处填写供测试的url
                        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                        connection.setDoOutput(true);
                        connection.setDoInput(true);
                        PrintWriter out = new PrintWriter(connection.getOutputStream());
                        out.print(para);
                        out.flush();
                        out.close();
                        BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                        String line = "";
                        String result = "";
                        while ((line = in.readLine()) != null) {
                            result += line;
                        }
                        System.out.println("第:" + NO + " 个");
                        semp.release();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            };
            exec.execute(run);
        }
// 退出线程池
        exec.shutdown();
    }
 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    aop-log:项目正式命名为aop-log,基于Spring AOP,ThreadLocal实现方法埋点,埋点信息记录和自定义收集

    AopLogAopLog是基于SpringAop和ThreadLocal实现的一个对请求方法埋点记录与处理的日志工具包。设计目的和场景:使用Spring Aop拦截程序,基本上都是同一个小异,不想日后每个项目都柏林都写一份这样的Aop拦截处理...

    j2ee的aop方式记录日志

    本教程将详细讲解如何在SSH框架中利用Spring AOP实现日志记录,并结合ThreadLocal存储用户和请求信息。 首先,理解AOP的基本概念。AOP允许我们定义“切面”,这些切面可以包含方法拦截器,这些拦截器在目标方法执行...

    SpringAop的简单理解.pdf

    exposeProxy参数则决定是否将代理对象暴露给ThreadLocal,以便可以在Bean内部获取到。 在SpringAOP中,有几个关键的概念: 1. 连接点(Joinpoint)是指程序执行中的某个特定位置,如方法的调用前后、抛出异常后。在...

    SpringBoot AOP处理请求日志打印功能代码实例

    通过示例代码,详细介绍了如何使用AOP来记录操作日志,包括请求开始、执行成功和异常等情况下的日志记录。该代码实例能够帮助读者更好地理解AOP的应用场景和实现方法。 知识点1: AOP的概念和应用场景 AOP是面向...

    springboot + mybatis +mysql+ sqlserver 双数据源

    3. 使用SpringAOP定义切面,对目标方法进行拦截,动态改变ThreadLocal中保存的数据源标识。 4. 在MyBatis的配置中,指定数据源,使MyBatis能根据当前数据源执行相应的SQL操作。 5. 测试用例,验证双数据源切换功能的...

    阿里云面试经验,详细记录所有面试题,分享个人面试心得

    * volatile和ThreadLocal的使用场景和原理 * synchronized和volatile的区别 * 模拟死锁场景和原子性与可见性 二、JVM相关 * JVM内存模型和GC机制 * GC的两种类型: Minor GC和Full GC * JVM里的classloader和双亲...

    java动态代理1

    `invoke` 方法接收三个参数:代理对象、被调用的方法以及调用方法时传递的参数。这样,我们可以在 `invoke` 方法内部添加额外的操作,如日志记录、事务管理、性能监控等,而不会影响原始的业务逻辑。 在给出的例子...

    Multi-Datasource-Autoswitch_mybatis_

    MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 在多数据源自动切换的场景中,通常有主从数据库或者不同的数据库环境...

    mybatis_springboot_mybatis_

    在业务逻辑中,通常会通过 AOP(面向切面编程)或者 ThreadLocal 来实现在运行时动态切换数据源。AOP 可以在特定的切入点(比如某个注解的方法)执行前/后,动态地设置数据源。ThreadLocal 则可以确保每个线程都有...

    acegi学习笔记

    - **AOP Alliance的MethodInvocation**:用于保护Spring容器内的业务对象,通过ProxyFactory Bean和BeanNameAutoProxyCreator等机制实现,与Spring事务管理类似。 - **FilterInvocation**:基于过滤器(Filter),...

    mybatis 多数据源 轮询访问

    Spring AOP可以结合ThreadLocal或其他全局变量来记录当前的轮询状态,确保每个请求都被均匀地分配到各个从库。 5. **MyBatis的动态SQL与数据源切换**: MyBatis允许在Mapper XML文件中使用动态SQL,这在处理多数据...

    Spring中文帮助文档

    ThreadLocal目标源 7.11. 定义新的Advice类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2. 单元测试 8.2.1. Mock对象 8.2.2. 单元测试支持类 8.3. 集成测试 8.3.1. 概览 8.3.2. 使用哪个支持框架 8.3.3. ...

    Spring API

    ThreadLocal目标源 7.11. 定义新的Advice类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2. 单元测试 8.2.1. Mock对象 8.2.2. 单元测试支持类 8.3. 集成测试 8.3.1. 概览 8.3.2. 使用哪个支持框架 8.3.3. ...

    2024java面试题.pdf

    ThreadLocal 的典型应用场景包括保存线程私有的配置信息、日志记录等。 以上就是针对2024年 Java 面试中可能出现的一些常见知识点的详细解读。这些知识点不仅覆盖了 Java 的基础知识,还包括了高级特性、设计模式、...

    Spring-Reference_zh_CN(Spring中文参考手册)

    ThreadLocal目标源 7.11. 定义新的通知类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2. 单元测试 8.3. 集成测试 8.3.1. Context管理和缓存 8.3.2. 测试fixture的依赖注入 8.3.3. 事务管理 8.3.4. 方便的变量 8.3.5. ...

    spring chm文档

    ThreadLocal目标源 7.11. 定义新的通知类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2. 单元测试 8.3. 集成测试 8.3.1. Context管理和缓存 8.3.2. 测试fixture的依赖注入 8.3.3. 事务管理 8.3.4. 方便的变量...

    Spring 2.0 开发参考手册

    ThreadLocal目标源 7.11. 定义新的通知类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2. 单元测试 8.3. 集成测试 8.3.1. Context管理和缓存 8.3.2. 测试fixture的依赖注入 8.3.3. 事务管理 8.3.4. 方便的变量...

    hibernate面试题

    - 使用ThreadLocal变量,每个线程都有自己独立的Action实例副本。 - 使用Spring框架的`prototype`作用域,每次请求都创建新的Action实例,避免线程安全问题。 2. Struts 中的关键对象及其作用: - `Action...

Global site tag (gtag.js) - Google Analytics