Reflex框架新特性-本地事务,再也不用担心程序崩溃了!

我们知道程序的可用性或者说健壮性非常重要,如果在用户使用的过程中,出现了程序崩溃,或者数据错误都是灾难性的。

为了最小化出错的概率,我们想各种办法来减错、容错、纠错。不管怎么减错,比如说提高代码质量、测试驱动开发、大量测试等等,但仍不可避免,还是有各式各样的错误出现。尤其是有UI,需要用户参与的话,错误会更多,因为你不知道用户到底是怎么使用应用程序的。所以容错不可避免!

在Java中,错误有两种类型,Error和Exception。我们能处理的主要是Exception。如果要容错,首先需要把错误限定到一定范围,捕获异常,更重要的是要保证数据的完整性。比如说,一个动作任务会有多个小任务,进行了一半,发生了异常。怎么办?这时,如果捕获了异常,但还不够,动作停留在中间位置,这是一个错误的状态,需要跳转到正确的状态。 怎么实现?这就是我们今天所讲的特性-本地事务所干的事。

例子地址在这里

1, 首先, 需要在感受方法上添加注解@Transacational

    /*
     * 感受方法,监听GridView中所有的按钮。
     */
    @Recept(target="grid.*", stimulation="android.view.View$OnClickListener")
    @Transactional("input")
    private void onItemClick(TextView view)
    {
        String text = view.getText().toString();
        stringInputCenter.input(text);
        if(text.equals(StringConstant.Exception))
        {
             int[] a = null;
             System.out.println(a.length); //发生异常
        }
    }

这样,该方法 就被本地事务给管理了,当方法内部发生了异常 ,则异常自动捕获 ,并且数据默认发生回滚。

2, 如果你需要自己处理异常,则可以实现IRollbackThrowableAware接口

@Receptor
public class StringInputReceptor implements IRollbackThrowableAware{
{
   ... //其他省略
   @Override
    public boolean onRollbackThrowable(final TransactionManager transactionManager,
            String transactionName, Throwable throwable) {
        stringInputCenter.info("在事务:" + transactionName + "中捕获到异常: " + throwable.getMessage());

        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            private int count = 5;
            @Override
            public void run() {
                stringInputCenter.info("准备回滚,倒计时: " + count);
                if(count == 0)
                {
                    transactionManager.rollback();
                    stringInputCenter.info("回滚成功!");
                    stringInputCenter.refresh();
                }
                else
                {
                    handler.postDelayed(this, 1000);
                }
                count --;
            }
        }, 2000);
        return true;
    }
}

在该例中,是这样处理异常的。首先提示用户发生了异常,然后倒计时回滚 ,以便用户有反应时间。

是不是很简单?

需要注意的是,本地事务回滚是基于数据的,这样的话有两个问题:

  1. 数据类型需要是特殊类型。这个很多人不高兴了,还是喜欢Java原生的。但其实无所谓,习惯就好,也没有增加多少工作量,为了程序稳定,为了用户,只能忍忍了,谁让顾客就是上帝呢。还有就是数据目前只支持Value<T> 类型,T是List和Map以外所有类型。至于List和Map,下一步会加上。
  2. 对于视图开发,需要数据驱动。但是很多GUI框架不是这样设计的,这也是Reflex需要去适配的地方。

PS. Reflex框架地址

时间: 2024-08-28 10:34:29

Reflex框架新特性-本地事务,再也不用担心程序崩溃了!的相关文章

SmartAssembly 6 + ClickOne 混淆发布,妈妈再也不用担心程序裸奔了

最近有个客户端项目用到ClickOne发布,用它主要也是因为它能检测并自动安装framework,而且也能自动更新. 后来由于项目需要,领导要求对程序进行加密处理,我们也当然照办了,于是找来了SmartAssembly,找到发布后的程序集是这样子的 使用ClickOne发布后程序集都是.deploy后缀的,那么只要把要加密的程序集改回dll,然后放到SmartAssembly里面进行混淆处理后再改回去,是不是就可以了呢? 答案是NO 因为这样做了之后自动更新就会异常,具体原因不明,不过根据个人推

利用flashback transaction query新特性进行事务撤销

具备了flashback version query查询的基础,我们就可以进行基于flashback version query的恢复.这就是flashback transaction query.flashback transaction query可以从FLASHBACK_TRANSACTION_QUERY中获得指定事务的历史信息以及Undo_SQL,通过这个UNDO_SQL,我们就可以恢复特定的事务.Flashback transaction query需要用到FLASHBACK_TRAN

Atitit.wrmi&#160;web&#160;rmi框架新特性

Atitit.wrmi web rmi框架新特性 1. V1d  新特性1 1.1. 增加了精确参数1 1.2. 增加了req参数,命名参数模式..1 1.3. 增加了globale  传递隐含参数req resp等1 1.4. Cs bs两个版本的实现1 2. V2 新特性2 2.1. $req对象预定义参数的支持2 2.2. 动态ioc   IocXq2142 2.3. end4 1. V1d  新特性 1.1. 增加了精确参数 1.2. 增加了req参数,命名参数模式.. 增加了对req参

[转帖]再也不用担心学不会K8S!17个K8S初学者必须掌握的知识点

再也不用担心学不会K8S!17个K8S初学者必须掌握的知识点 https://zhuanlan.zhihu.com/p/94656981 Kubernetes是一个可移植.可扩展的开源平台,用于管理容器化的工作负载和服务,有助于声明式配置和自动化.目前,Kubernetes正在以强劲的势头持续发展,其相关的生态也在不断完善.本文中,我们列出了所有Kubernetes入门者对于部署和管理Kubernetes容器不得不关注的17个方面. 1. 设置Kubernetes集群 Kubernetes有多个

Matlab命令合集 妈妈再也不用担心我不会用matlab了

matlab命令 一.常用对象操作:除了一般windows窗口的常用功能键外.1.!dir 可以查看当前工作目录的文件. !dir& 可以在dos状态下查看.2.who 可以查看当前工作空间变量名, whos 可以查看变量名细节.3.功能键:功能键 快捷键 说明方向上键 Ctrl+P 返回前一行输入方向下键 Ctrl+N 返回下一行输入方向左键 Ctrl+B 光标向后移一个字符方向右键 Ctrl+F 光标向前移一个字符Ctrl+方向右键 Ctrl+R 光标向右移一个字符Ctrl+方向左键 Ctr

Xcode7的发布后的crash跟踪,轻松定位崩溃代码 Address Sanitizer: 妈妈再也不用担心 EXC_BAD_ACCESS

Xcode7中苹果为我们增加了两个重要的debug相关功能.了解之后觉得非常实用,介绍给大家. 1.Address Sanitizer: 妈妈再也不用担心 EXC_BAD_ACCESS? EXC_BAD_ACCESS一直是很多开发者的噩梦,因为这个错误很不直观,出现后往往要花很长时间才能定位到错误.苹果这次带来了革命性的提升. 在项目的Scheme中Diagnostics下,选中enable address sanitizer(注意选中后Xcode会重新编译整个项目). 这样设置后,如果再出现类

【阿里云产品公测】离线归档OAS,再也不用担心备份空间了

[阿里云产品公测]离线归档OAS,再也不用担心备份空间了 作者:阿里云用户莫须有3i 1 起步  1.1 初识OAS  啥是OAS,请看官方说明: 引用: 开放归档服务(Open Archive Service,简称OAS),致力于提供低成本.高可靠的数据归档服务,适合于大数据的长久归档备份. 低成本.高可靠,长久归档备份,这是它的特色.  1.2 申请开通 当前还处于公测阶段,需要申请,试用期间,免费试用,每个用户可以存储不超过10T的数据,并且文件数量不超过10万个,大伙有什么超大文件,没地

完全免费,再也不用担心转pdf文件乱来乱去的问题了

完全免费,再也不用担心转pdf文件乱来乱去的问题了. 源代码:https://github.com/xlgwr/WpsToPdf.git 第三方插件Bye Bye... 功能说明 主要引用Wps金山办公软件生成pdf功能 可部署到IIS服务器,直接调用API,生成PDF文件 可转文件类型,xls,xlsx,ppt,pptx,doc,docx等Wps金山办公软件所有支持的文件类型. 安装最新Wps 金山办公软件 引用Wps 对应com dll 使用VS2019 打开,生成,运行 web api 发

妈妈再也不用担心我找不到文件了---find

1.find vs locate 在实际中,我们经常需要查找到一些特定文件,然后进行处理,LINUX提供了locate , find这两个命令用于文件查找. a.locate,非实时查找,非精确查找.linux会定期生成更新文件数据库,而locate将根据文件数据库进行查找.我们可以在使用locate命令前,更新文件数据库,使用updatedb即可.但是updatedb将会花费可能半天时间,SO LONG! b.find , 实时查找,精确查找.根据指定路径,查找标准,进行文件遍历(包括隐藏文件