Prototype功能预览四:异步处理-完美解决Spring中的事务问题

来源:互联网 发布:做淘宝美工怎么样 编辑:程序博客网 时间:2024/06/07 21:06

框架整体介绍:http://blog.csdn.net/flyxxxxx/article/category/7055640

对此框架有兴趣或想参与开发的请加QQ群:255195191

在Spring框架中,通常建议事务在Service层完成,但这样实际会造成这样一些问题:

1、部分开发会在Controller层调用了多个Service去写数据库(这只有通过代码的review才能发现)。这在大多数情况下不是问题,但如果是微服务环境,可能会引起大量数据不一致问题。

如果切换事务到Controller层或Servlet过滤器中,会造成不需要事务的也开启了事务。

2、调用某些数据库操作后,需要异步抛出一个事件,在Service这一层可能因事务未提交,事件处理出现问题。

3、需要记录用户的操作日志时,操作日志严格来说,应该在控制器层完成,与业务处理的线程不应该是同一线程(实际开发现状是几乎所有系统都没这样做),要在控制器层异步记录操作日志,通常只能写个丑陋的回调线程了。


在Prototype框架中:

public class DemoBusiness extends Business{

    public boolean validate(){
        //在这个方法进行数据校验
    }

    public void business(TestService ts,Connection connection){
       //在这个方法完成主要业务部
    }
    void async(ApplicationEventPublisher publisher){
        //在这个方法异步抛出事件,此方法会被框架异步调用
    }
    void async(LogService ls){
        //在这个方法记录操作员日志,此方法会被框架异步调用
    }

}
以上方法中,async开头的方法(此规则也可以自己定义),参数可以自定义(只要它来源于Spring applicationContext),被默认为是异步调用的.可以有多个async命名的方法。如果需要,还可以在任意方法上加spring注解@Async来标明此方法需要异步执行

在Prototype框架中,被标明为异步执行的方法,自动使用线程池(如果在Spring applicationContext中有定义一个线程池)来执行异步操作,不需要程序员来指定(当然也可以通过参数指定)。

在Prototype框架中,不同的业务方法(此规则可通过一个注解自定义)根据预先的定义,可以有不同的事务,只读,可写,无事务,异步事务等。以应对不同的场景。

在Spring中,Async注解虽然有异步功能,但使用上并没有Prototype框架灵活。



阅读全文
0 0
原创粉丝点击