博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
卓正PageOffice文件并发控制
阅读量:6081 次
发布时间:2019-06-20

本文共 2803 字,大约阅读时间需要 9 分钟。

hot3.png

1.功能介绍

PageOffice的并发控制功能用来解决多个用户在线编辑同一篇文档可能造成的互相覆盖修改结果的技术难题。

B/S架构下用户访问都是并发的,也就是说经常会出现同时N个用户对一个服务器页面发出请求,这就有可能同一个文档被多个用户同时打开进行编辑。为什么会出现互相覆盖呢?举个简单例子,例如A用户先访问页面打开了一个文档开始编辑,这时B用户访问相同的页面打开了同一个文档也开始编辑,B用户可能很快就完成了文档修改工作并且保存到服务器。随后A用户也完成了工作并保存文档到服务器。这时,服务器上的这个文档已经变成了A用户修改的最后结果,B用户的修改被A的保存操作覆盖从而消失了。

PageOffice的并发控制能够保证同一时间同一篇文档只能由一个人打开,而这样复杂的控制只需要开发者简单对TimeSlice属性赋值即可实现。无论打开的文档是存放在数据库还是存在物理磁盘里,只要对此文档设置了并发控制,那么实现的效果都是只有当前用户可以对此文档进行编辑、保存等操作,其他用户只能以只读的形式打开。在并发控制期间,其他用户有三个选择,分别是“终止”、“重试”和“忽略”。选择“终止”,则关闭当前提示对话框,对此文档不进行任何操作;选择“重试”,则可以了解当前操作用户的编辑时间是否已经用完,同时可以看到当前操作用户的剩余编辑时间;选择“忽略”,则以只读方式打开此文档,即只能阅读此文档,不能对此文档进行编辑、修改、保存等操作。

2. 如何实现并发控制

在WebOpen之前设置属性TimeSlice。例如设置PageOfficeCtrl1.TimeSlice = 4;那么登录用户对这个文档的编辑时间即为4分钟。用户必须在编辑时间结束之前,进行编辑、保存等操作,在编辑时间结束之后,用户已经编辑的未保存的内容将无法保存。

PageOfficeCtrl1.TimeSlice = 4;//对当前文档开启并发控制
TimeSlice只对当前WebOpen打开的文档有效,如果不赋值,就不进行并发控制。默认值是0,表示不进行并发控制。

注意:

  1. 这里所说的同一份文档,以WebOpen的第一个参数为判断标准。如果两次WebOpen的第一个参数完全相同则视为同一个文档,如果不同则视为不同文档。
  2. 如果两次WebOpen的第一个参数完全相同,第三个参数(用户名)也完全相同,则视为用户修改编辑文档的同时参考原来的文件,属于特殊需要,这时并发控制不起作用。

WebOpen直接打开文档或打开动态页面输出的文档,都可以实现并发控制:

(1)直接打开文档,WebOpen的第一个参数是office文件名结尾。
例如用户a的打开文档的操作如下:

PageOfficeCtrl1.TimeSlice = 4;PageOfficeCtrl1.WebOpen("doc/abc.doc", PageOffice.OpenModeType. docAdmin, "a");

用户b的打开文档的操作如下:

PageOfficeCtrl1.TimeSlice = 4;PageOfficeCtrl1.WebOpen("doc/abc.doc", PageOffice.OpenModeType. docAdmin, "b");

那么如果对doc/abc.doc这个文档设置了并发控制的话,当a打开此文档后,b只能以只读方式打开此文档,直到a的控制时间结束后,b才可以对此文档进行编辑。

(2)通过动态页面打开文档,WebOpen的第一个参数是一个动态页面的地址,还带有参数值。
例如用户a的打开文档的操作如下:

PageOfficeCtrl1.TimeSlice = 4;PageOfficeCtrl1.WebOpen("a.aspx?id=1", PageOffice.OpenModeType. docAdmin, "a");

用户b的打开文档的操作如下:

PageOfficeCtrl1.TimeSlice = 4;PageOfficeCtrl1.WebOpen("a.aspx?id=1", PageOffice.OpenModeType. docAdmin, "b");

那么如果对这个a.aspx?id=1地址下载的文档设置了并发控制的话,当a打开此文档后,b只能以只读方式打开此文档,直到a的控制时间结束后,b才可以对此文档进行编辑。

3.什么情况下,并发控制不起作用了?

同一个office文件,有两个不同的url地址都可以下载这个文件,当两个用户使用不同的地址打开同一个office文件的时候,并发控制就不起作用了。

(1)例如都是两个不同的动态页面地址都可以下载同一个文件:地址a.aspx?id=1和地址b.aspx?id=1下载的是服务器端同一个文档,用户a的打开文档的代码是:

PageOfficeCtrl1.TimeSlice = 4;PageOfficeCtrl1.WebOpen("a.aspx?id=1", PageOffice.OpenModeType.docAdmin, "a");

用户b的打开文档的代码是:

PageOfficeCtrl1.TimeSlice = 4;PageOfficeCtrl1.WebOpen("b.aspx?id=1", PageOffice.OpenModeType. docAdmin, "b");

这样虽然“a.aspx?id=1”和“b.aspx?id=1”打开的是同一个文档,但是因为WebOpen的第一个参数值不同,对于PageOffice来说打开文档的URL也不同,PageOffice认为是两个不同的文件,这种情况并发控制就不起作用了。

(2)例如一个用动态页面地址和一个用文档名结尾的URL地址:访问“a.aspx?id=1”下载的文件就是doc/abc.doc,用户a的打开文档的代码是:

PageOfficeCtrl1.TimeSlice = 4;PageOfficeCtrl1.WebOpen("a.aspx?id=1", PageOffice.OpenModeType. docAdmin, "a");

用户b的打开文档的代码是:

PageOfficeCtrl1.TimeSlice = 4;PageOfficeCtrl1.WebOpen("doc/abc.doc", PageOffice.OpenModeType. docAdmin, "b",);

还是因为WebOpen的第一个参数值不同,虽然打开的是同一个文档,但是因为PageOffice认为两个文档的URL不一样,所以并发控制也不起作用。

注:此功能不支持PHP开发或集群方式部署。

转载于:https://my.oschina.net/u/3850288/blog/2046277

你可能感兴趣的文章
章文嵩-构建云计算平台的实践
查看>>
Sql delete 语句时表别名写法
查看>>
EGOTextView
查看>>
redis监控客户端redis-cli
查看>>
hibernate中拦截器与事件监听器的区别
查看>>
一个简单的电话本程序,支持添加和查找功能。
查看>>
使用堆栈实现括号的匹配
查看>>
超强壮的RSA加密Android短信
查看>>
MyEclipse中把选中的一部分代码变成全部大写或小写快捷键
查看>>
图片缩放
查看>>
自定义表单中计算控件的插件代码
查看>>
Java中的代理的使用
查看>>
springboot 下载文件
查看>>
使用C#创建SQL Server的存储过程
查看>>
一个鸡蛋的启示(传疯了)
查看>>
FreeMarker的优点和缺点
查看>>
ubuntu 安装tengine
查看>>
Java类到对象的创建过程
查看>>
eclipse下安装js插件-spket(支持Ext) 能格式化Js(JQuery自动提示)
查看>>
Scala之类、特质和抽象类
查看>>