`

用AOP实现业务service的重新调用(三)

阅读更多

承接 用AOP实现业务service的重新调用(二),我们继续......

 

代码看似不多,但实现上需要考虑很多问题,因为哪怕只有一个问题没搞定,整个实现就是失败的.

 

问题列表:
1>事务完整性的问题

       前后两次,是否能保证事务的完整性,我们的事务正好也是通过spring的aop实现的,所以要注意我们新加的ServiceRetryAdvice拦截器要在spring事务拦截器之前调用,也就是包在事务拦截器外面,这样才不会影响spring的事务提交/回滚机制.

 

<value>serviceRetryInterceptor</value>
<value>transactionInterceptor</value>

 

 

<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
		<property name="transactionManager"><ref bean="transactionManager"/></property>
		<property name="transactionAttributeSource"><ref bean="txAttribute"/></property>
	</bean>
	
	<bean id="transactionManagerAutoProxy" 
			class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
		<property name="interceptorNames">
			<list>
				<value>serviceRetryInterceptor</value>
				<value>transactionInterceptor</value>
			</list>
		</property>
		<property name="beanNames">
			<list>
				<value>testRootService</value>
				<value>testService</value>
			</list>
		</property>
	</bean>

 

2>事务传播行为PROPAGATION

      通常最简单的情况是一个service方法对应一个事务,按照前面的配置,这种情况是没有问题的,前一次调用失败后,重新调用service,spring会重新开始一个事务,所以新事务会获取一个新的连接,执行成功返回前端.

       

       还有一种情况是service方法里面又调用了子service方法,我们遇到的情况用的是PROPAGATION_REQUIRED(子service方法里面判断当前线程是否存在transaction,如果存在就复用,不存在再创建新transaction),所以这里仅讨论PROPAGATION_REQUIRED的情况,其它情况可以自己去详细考证,如果exception是发生在父service方法里面,没有问题.如果发生在子service方法里面,我们重调的是子service方法,这种情况下retry调用的时候,因为transaction还在,所以继续复用原来的transaction可是transaction里面的connection还是原来的无效连接,所以retry仍然会百分之百失败,所以这种case我们无能为力,直接把异常抛给前端.因为事务的commit/rollback只在父service方法里面进行,所以不会破坏事务的完整性.

 
3>多线程的问题(retryNum)

       为了提高效率,spring内部对interceptor进行了cache,同一个service class+method,会共用同一个interceptor,所以多线程环境下,retryNum成员变量要保证线程安全,解决方法是:我们用了ThreadLocal<Integer>,这样就不用担心多线程访问的问题了.

 

4>ThreadLocal的注意事项

关于ThreadLocal,还需要注意内存泄露的问题,因为ThreadLocal内部对每一个线程都留了一个map,所以我们在使用完以后要主动remove掉里面的内容.

 

} finally {
			retryNum.remove();
}

 

 

 

分享到:
评论

相关推荐

    spring的aop实现

    AOP是一种编程范式,它将关注点分离,使系统中的核心业务逻辑与辅助性任务(如日志、安全检查等)解耦。在Spring中,这些关注点被封装为“切面”(Aspect),并在运行时通过“通知”(Advice)动态地插入到目标对象...

    使用Spring的注解方式实现AOP的细节

    在Spring框架中,面向切面编程(AOP)是一种强大的工具,它允许程序员定义横切关注点,如日志、事务管理、权限控制等,这些关注点可以被模块化并独立于业务逻辑进行处理。本篇文章将深入探讨如何通过Spring的注解...

    Spring Aop的简单实现

    在SLT-Spring-AOP这个项目中,你可以找到具体的实现示例,包括如何定义切面、通知和切入点表达式,以及如何在业务代码中应用这些概念。通过对该项目的深入学习,你将能够更好地理解和掌握Spring AOP的实战应用。

    Xml配置实现AOP

    AOP是一种设计模式,它允许我们定义横切关注点,并将其与业务逻辑分离,从而提高代码的可维护性和复用性。下面将详细探讨在XML配置中如何实现这两种AOP方式。 ### 1. 基于代理实现AOP切面编程 基于代理的AOP实现...

    JAVA 中Spring aop 实现日志记载

    下面将详细介绍如何在Spring框架中使用AOP来实现日志记载。 1. **AOP基本概念** - **切面(Aspect)**:切面是关注点的模块化,如日志、事务管理等,它结合了业务逻辑与横切关注点。 - **通知(Advice)**:通知...

    java分页 动态代理 aop实现

    2. 编程式AOP:使用`Aspect`和`Pointcut`定义切面和切入点,然后在代码中手动调用`JoinPoint`进行通知执行。 在Spring MVC和Hibernate的结合应用中,我们可以利用AOP进行分页操作的优化。例如,可以在Service层方法...

    maven工程AOP实现demo

    通过这个Maven工程AOP实现的demo,我们学习了如何在Spring项目中使用注解进行AOP编程,包括定义切面、切入点、通知,并配置Spring以启用AOP。这种方式使得我们可以轻松地在不改动业务代码的情况下,插入横切关注点,...

    使用AOP实现监控日志并保存

    通过这种方式,我们可以使用Spring AOP来实现对应用程序的监控日志,而无需侵入业务逻辑。这种解耦使得日志管理和维护变得更加灵活,同时也提高了代码的可读性和可维护性。 在实际项目中,`lib`文件夹通常包含项目...

    Spring AOP的简单实现

    在这个场景中,我们将使用Spring AOP来实现一个日志记录的功能,以追踪系统中各个方法的调用情况,包括访问时间以及传递的参数。下面将详细阐述如何实现这一目标。 首先,我们需要了解AOP的基本概念。AOP的核心是切...

    使用Spring配置文件实现AOP

    三、配置文件实现AOP 1. 配置Advisor:Advisor是通知和切点的组合。在Spring的XML配置文件中,我们可以创建一个`&lt;aop:config&gt;`元素,并在其内部定义`&lt;aop:advisor&gt;`来创建Advisor。Advisor的`advice-ref`属性用于...

    spring aop 实现权限的简单示例

    总结,Spring AOP提供了一种优雅的方式,让我们可以在不侵入业务逻辑的前提下实现权限验证。通过定义切面、通知和切入点表达式,我们可以轻松地控制代码的执行流程,增强代码的可维护性和可扩展性。这个简单的示例...

    aop思想的java实现

    1. **不使用AOP实现日志记录** 在没有AOP的情况下,我们通常会在每个方法的开始和结束处手动添加日志记录代码,如下所示: ```java public void doSomething() { System.out.println("开始执行doSomething"); // ...

    AOP__使用JDK中的Proxy技术实现AOP功能

    在Java中,我们可以使用JDK的动态代理(Proxy)来实现AOP的功能,这主要涉及到反射和接口编程。 **JDK动态代理的工作原理** JDK的Proxy类提供了一种机制,可以创建一个代理对象,该对象在调用方法时会执行自定义的...

    SpringBoot基于注解实现Aop

    在Spring Boot框架中,AOP(面向切面编程)是一种强大的设计模式,它允许程序员将关注点分离,比如日志、事务管理等,从核心业务逻辑中抽离出来。本指南将详细介绍如何通过注解来实现Spring Boot中的AOP。 首先,让...

    模拟spring aop【一】基于jdk动态代理实现的aop

    在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者定义“切面”,这些切面可以包含业务逻辑的某一部分,比如日志、事务管理或安全控制。切面可以在多个对象中统一地应用,提高了代码的复用性...

    基于annotation的aop实现

    基于Annotation的AOP实现是Spring框架的一个重要特性,它极大地简化了AOP的使用。在本篇文章中,我们将深入探讨基于Annotation的AOP实现,特别是动态代理的理念。 首先,了解什么是AOP。AOP的核心概念是“切面”...

    Aop jdk proxy实现小例子

    在上述代码中,当我们通过代理对象`proxyService`调用`doSomething()`方法时,实际上会先执行`MyInvocationHandler`中的`invoke()`方法,从而实现AOP的预处理(Before)和后处理(After)逻辑。 总结来说,通过JDK ...

    spring aop 拦截器简单实现

    它是一个实现了`org.springframework.aop.MethodBeforeAdvice`、`org.springframework.aop.AfterReturningAdvice`或`org.springframework.aop.ThrowsAdvice`等接口的对象,可以在方法调用前后执行自定义逻辑。...

    Xml文件配置实现AOP通知

    在面向切面编程(Aspect Oriented Programming,简称AOP)中,我们关注的是横切关注点,即那些跨越多个对象和模块,与业务逻辑交织在一起但又相对独立的代码,如日志、事务管理、性能监控等。Spring框架提供了强大的...

    研究下Spring中AOP的实现?

    4. 使用AOP:在业务代码中,当匹配的连接点被触发时,对应的切面通知将会自动执行。无需显式调用。 通过上述步骤,`myAOPExample`展示了如何在Spring中定义、配置和应用AOP。这使得我们可以轻松地在不修改原有业务...

Global site tag (gtag.js) - Google Analytics