大家好,線上文庫系列的一二中已經講述了線上文庫的思路和文檔轉換的細節。有了這些似乎還不夠,文檔何時轉換,是人為轉換呢?還是由電腦自動轉換?接下來我們圍繞這個問題提出解決方案,我已經通過測試,驗證了各方法的可行性。
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檔案的展示,也就是文檔播放。
謝謝大家的支援,祝大家天天好心情,我是百靈。