Flash Scope

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

而这部分对象的存储:

(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
 

 

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