我在设计在线文库中的一些小记(在线文库系列三之分离转换业务)
大家好,在线文库系列的一二中已经讲述了在线文库的思路和文档转换的细节。有了这些似乎还不够,文档何时转换,是人为转换呢?还是由计算机自动转换?接下来我们围绕这个问题提出解决方案,我已经通过测试,验证了各方法的可行性。
1.转换业务:
(1)、人工转换:
用户上传文件 —> 文档编辑专员对用户所上传文档进行审核。并设置审核标识 —> 管理员择时对已经通过审核的文档进行转换
(2)、计算机转换:
用户上传文件 —> 计算机初审 —> 计算机启动文档转换程序 对文档转换 —> 同时启动进程监控服务,对死锁转转换程序进行关闭,释放内存资源
补充:在整个文档业务中,我们希望加入举报业务,即对不良文档进行举报。(管理员可以针对被举报文档做出有针对性的管理)
2.业务实现细节:
(1)、增加第一种业务,由于要增加相应的审核工作,在人力上有所投入,所以暂不考虑第一种业务形式。
(2)、我们着重来看一下第二种业务形式。
计算机启动文档转换程序 对文档转: 这一步我们可以写一个windows服务,设定服务的执行时间,即每服务每隔多入执一次,至于文档转换的细节,我已经在
"我在设计在线文库中的一些小记(在线文库系列二文档转换)"中公布了原程序。如果您对windows服务程序的编写有任务疑问的话,先Google学习一下,我也会在后续博客中来讲解windows服务的编写。
重点1:由于windows所启动的转换程序是安装在服务器上的,是桌面程序。所以这里要强调一下服务的设置。 右击服务,选择属性,将“允许服务与桌面交互”勾选。这样,服务在运行的时候就可以正常启动文档转换程序了。
重点2:由于转换程序遇到用户所上传的恶意文件时,会发生转换出错,然后进程死了。这样会造成服务器大量资源浪费和被占用的情况。为了合理利用资源,我们还需要编写一个进程监控服务,专门监控相应该的死进程。
以下是进程监控的程序:
partial class ProcessManager : ServiceBase
{
private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public ProcessManager()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
MyTime.Interval = 600000;//每10分种钟执行一次
MyTime.Start();
}
protected override void OnStop()
{
MyTime.Stop();
MyTime.Dispose();
}
private void TimerEventProcessor(object sender, System.Timers.ElapsedEventArgs e)
{
log.Info("执行进程管理!");
try
{
foreach (Process thisproc in Process.GetProcessesByName("WINWORD"))
{
TimeSpan oTime = DateTime.Now.Subtract(thisproc.StartTime);
if (oTime.Minutes >= 1)//如果开启的程序在10分钟内没有完成运行,就强行关闭,释放资源
thisproc.Kill(); //结束进程
}
}
catch (Exception ex)
{
log.Info(ex.Message);
}
}
}
好了,有了这两个服务,我们就可以完成文档转换的自动化,同时也能保证服务器资源的不被浪费。
将文档转换的过程分离到windows服务中,可以将用户上传与文档转换功能相分离,功能相独立,减少依赖。同时也很大程序上的提升了用户体验。怎么样,第二种业务形式不错吧!
好了,今天就写到这里了,下一篇文章我将会重点讲述一下swf文件的展示,也就是文档播放。
谢谢大家的支持,祝大家天天好心情,我是百灵。