用iSpring+MSMQ+觸發器 達成自動PPT轉SWF

用iSpring+MSMQ+觸發器 達成自動PPT轉SWF

功能:

使用者上傳PPT檔後做SWF轉檔,我們要考量到的因素有下列:

1.程式專檔不直接在asp.net的程序做,因為這樣會讓User會誤以為網頁死當

2.不透過資料庫

  1.原本一開始是打算要用觸發器(Trigger)來做,後來放棄.....因為要開啟xp_cmdshell 實在太危險了

  2.後來又想到第二個方式,先把要轉檔的資料訊息寫到DB,在寫一支WebService每分鐘讀這個DB做轉檔,後來放棄,因為我不太愛每分鐘去讀DB這個動作.....

3.不能與原本的專案有任何的關聯,將來的其它專案也能一併使用

安裝:

1.iSpring下載網址 下載    (下載後安裝) 30天試用

2.安裝訊息佇列(MSMQ)

  2010-8-17 下午 05-59-13

如果在安裝訊息佇列發生錯誤訊息(0x42c)時你需要檢查以下條件:

  • 先去控制台>>系統管理>>服務
  • 找尋下列服務是否都有開啟

Windows XP

  • Distributed Transaction Coordinator
  • Message Queuing access control
  • NT LM Security Support Provider
  • Reliable Multicast Protocol Driver
  • Remote Procedure Call (RPC)
  • Security Accounts Manager

Windows 2003 server

  • Message Queuing access control
  • NT LM Security Support Provider
  • Remote Procedure Call (RPC)
  • RMCAST (Pgm) Protocol Driver
  • Security Accounts Manager

Windows Vista

  • Message Queuing access control
  • Remote Procedure Call (RPC)
  • Windows Event Log

轉檔程式:

接下來,我們要寫一支轉檔的控制台程式,程序如下

  1. 新增控制台專案
  2. 引入參考 iSpring 5.0 Type Library
  3. 撰寫程式
using System;
using System.Collections.Generic;
using System.Text;
using iSpring;

namespace ispring_samples
{


    public class Сonverter
    {

        static void Main(String[] args)
        {
            PresentationConverter converter = new PresentationConverter();
            string path = @"c:\test\";
            try
            {
                ///args[0]原始PPT檔案
                converter.OpenPresentation(args[0]);
                PrintMessage("Start Convert....");
                converter.GenerateSolidPresentation(path + (Guid.NewGuid()) + ".swf", "online", "");
                converter.ClosePresentation();
            }
            catch (Exception)
            {
                PrintMessage(("Error: " + converter.LastErrorDescription));
            }            
        }

        private static void PrintMessage(String message)
        {
            Console.WriteLine(message);
        }
    }
}

設定MSMQ:

接下來的動作,是每當佇列接收到訊息,馬上會將資料丟給轉檔程式做轉檔,一步一步跟我做唄 ^^

  1. 控制台>系統管理>電腦管理
  2. 訊息佇列>私用佇列,按右鍵新增一個私用佇列(這裡是用ispring),然後將交易式打勾這是為了確保我們的訊息是用交易模式,以防資料遺失

2010-8-17 下午 06-15-58

 設定MSMQ觸發器:

  1. 在訊息佇列觸發程序>規則>新增一個規則
  2. 輸入規則名稱>按下一步
  3. 規則條件不用給條件,直接按下一步
  4. 接下來規則動作設定如下,其中的執行檔路徑指向我們寫的專檔程式
  5. 設定參數,請選擇[訊息本文],而這裡的訊息本文就是指我們預轉檔的檔案
  6. 與桌面互動如果打勾,表示會跑出執行畫面,這裡我們將他打勾以方便測試

 2010-8-18 上午 10-45-42 2010-8-18 上午 10-49-55

      規則建立完之後,我們就要來建立觸發器

  1. 在訊息佇列觸發程序>觸發程序>新增一個觸發器
  2. 觸發程序名稱填入: .\private$\ispring 後按下一步
  3. 接下來,選擇我們剛建立的規則,就完成了我們觸發程序的動作了

2010-8-18 上午 10-40-59

2010-8-18 上午 10-58-50

撰寫WEB AP程式:

  1. 建立一個新網站,裡面只放了一個發送的按鈕Button1
  2. 撰寫發送訊息程式
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Messaging;

public partial class Queue : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        try
        {
            MessageQueue MyMessageQ = new MessageQueue(@".\Private$\ispring");
            //使用交易模式
            MessageQueueTransaction mt = new MessageQueueTransaction();
            //MyMessageQ.Formatter = new MyFormater();
            mt.Begin();
            System.Messaging.Message message = new System.Messaging.Message();
            //訊息編碼模式
            message.Formatter = new System.Messaging.ActiveXMessageFormatter();
            message.Body = @"c:\test\2.ppt";
            MyMessageQ.Send(message,mt);
            mt.Commit();
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }
    }
}

 

大致上的功能已經完成,當你按下按鈕後會執行

WEB AP=>MSMQ QUEUE=>Exceute MSMQ Trigger=>Call the Convert Program=> ?????

但有沒有發現一件事,我們轉檔是轉檔完成了,但好像少了一個步驟

訊息還存在!? 這會造成什麼問題,如果你嘗試著把訊息留著~~你重開機電腦後,電腦會很聰明的把你所有的訊息佇列在重頭到尾在跑一次

那可是一個大災難呀 lol

所以我們要多加一個動作,就是轉檔完後要將訊息移掉

 

多設定一個規則的參數(訊息識別碼):

  1. 訊息Queue移除檔案是依照他所謂的訊息識別碼,所以我們要在規則裡,多傳這一個參數

2010-8-18 上午 11-08-36

    2010-8-18 上午 11-09-53

修正轉檔程式增加移除功能:

  1. 接下來我們修改一下轉檔程式
using System;
using System.Collections.Generic;
using System.Text;
using iSpring;
using System.Messaging;

namespace ispring_samples
{


    public class Сonverter
    {

        static void Main(String[] args)
        {
            PresentationConverter converter = new PresentationConverter();
            MessageQueue popQ = new MessageQueue(@".\Private$\ispring");
            string QueueKey = args[1];
            string path = @"c:\test\";
            try
            {
                ///args[0]原始PPT檔案
                converter.OpenPresentation(args[0]);
                PrintMessage("Start Convert....");               
                converter.GenerateSolidPresentation(path + (Guid.NewGuid()) + ".swf", "online", "");                
                //移除佇列訊息
                //PrintMessage(QueueKey);
                popQ.ReceiveById(QueueKey.Replace("{","").Replace("}",""));
                converter.ClosePresentation();
            }
            catch (Exception)
            {
                PrintMessage(("Error: " + converter.LastErrorDescription));               
            }
           
        }

        private static void PrintMessage(String message)
        {
            Console.WriteLine(message);
        }
    }
}

呼....

大概花了一天的時間做研究跟找元件

大功告成!!!我們已經做出了一個雛形了,太好了  ^ ^; 

第一次寫那麼長的文章,請多指教