欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Flash Scope

程序员文章站 2022-04-11 22:35:09
...

项目中遇到了一个潜在的问题,大致就是说,在一个流程的两个或某几个环节中,需要短暂地存储一部分对象(如果不存储,就需要在这几个环节中多次调用同一个外部接口,这被认为是不够合理的实现)。

而这部分对象的存储:

(1)如果用request,太小,毕竟一次提交以后就丢失了,如果需要往后传递,可能需要借助一些页面参数传值等丑陋或是不易控制的方法;

(2)如果用session,太大,我不需要在整个用户会话生命周期内使用,而且如果同个用户并行地操作两个流程,期间会互相影响到。

 

其实在Rails/Grails里面就已经包含了一个机制,它将对象短暂地放置在session中,request-response连续的两个环节后再清除掉这个短暂保存的对象,就叫是Flash Scope。

它的原理很简单,内部定义了两个Map,将保存在里面的数据,在两个Map里面来回转移,这样就保证在下一次请求到来时,只需要将其中一个Map的数据转移到另外一个Map中,而清除掉一个Map。这样就保证一次在重定向时,该作用域下依然保存数据。而在第二次的请求时,如果没有新的数据加进来,原来的数据将会被清空。

这里有一个简单的例子:http://yongtree.javaeye.com/blog/629572

 

看起来好像结束了,不过,把思路扩展一下:

(1)这样的做法可以支持若干次的request-response,一串这样的requset-response就可以成为一条工作流。

(2)上面的做法解决了对象在对个环节中传递的问题,那么,怎样解决在同个用户并行地操作两个流程时,会互相影响到的问题?

 

我想其实也不难,只需要稍稍扩展一下,如果这样的问题确实需要解决,那就在存入这个短命对象到Map时,使用的key需要包含一个唯一序列x,而这个x最易想到的就是以系统当前时间为参数,让这个x作为hidden参数的形式经由页面传递,从而保证了一整条工作流中行为的独立性。

 

我画一个简单的时序图来说明:


Flash Scope
            
    
    博客分类: System Design ScopeGrails
 

 

文章系本人原创,转载请注明作者和出处

  • Flash Scope
            
    
    博客分类: System Design ScopeGrails
  • 大小: 62.5 KB
相关标签: Scope Grails