首先,建立一個windows服務專案

16054R538-0  

然後進行設計檢視

16054T446-1  

在工作區空白處右屬,添加一個安裝專案

16054SM5-2  

然後就可以寫我們的代碼了,我們的服務需要即時監視MSMQ的佇列中有沒有記錄,如果有,就向資料庫中插入
核心代碼如下
/// <summary>
/// 接收來自MSMQ的消息,並保存到資料庫
/// </summary>
public class MessageQueueService
{
public static bool blnStopThread;
public static string exTemp = string.Empty;
public MessageQueueService()
{
//
// TODO: 在此處添加建構函式邏輯
//
}
public static void Start()
{
string queuePath = ".\\Private$\\zzl";
IsQueueExists(queuePath);
MessageQueue myQueue = new MessageQueue(queuePath);
myQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(Log) });
do
{
try
{
// Receive and format the message.
Message myMessage = myQueue.Receive(); //當訊息佇列空時,執行緒會掛起
Log log = (Log)myMessage.Body;
if (log == null) return;
Save(log);//保存到資料庫,此處略詳細代碼
}
catch (System.Exception ex)
{
//異常處理
//……
}
} while (blnStopThread == false);
}
private static void IsQueueExists(string path)
{
if (!MessageQueue.Exists(path))
{
MessageQueue.Create(path);
}
}

 

private static void Save(Log entity)
{
using (SqlConnection sqlconn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["conn"].ToString()))
{
using (SqlCommand sqlcomm = new SqlCommand(
"INSERT INTO [Web_Logs]([LogID],[FromURL],[ExeSQL],[FromSystem],[HttpMethod],[OccurTime],[info]) VALUES (@LogID,@FromURL,@ExeSQL,@FromSystem,@HttpMethod,@OccurTime,@Info);"
, sqlconn))
{
SqlParameter parameter = new SqlParameter("@ExceptionID", SqlDbType.VarChar, 36);
parameter.Value = Guid.NewGuid().ToString();
sqlcomm.Parameters.Add(parameter);
parameter = new SqlParameter("@LogID", SqlDbType.VarChar, 36);
parameter.Value = entity.ID;
sqlcomm.Parameters.Add(parameter);
parameter = new SqlParameter("@FromURL", SqlDbType.VarChar, 200);
parameter.Value = string.Empty;
sqlcomm.Parameters.Add(parameter);
parameter = new SqlParameter("@ExeSQL", SqlDbType.VarChar, 1000);
parameter.Value = string.Empty;
sqlcomm.Parameters.Add(parameter);
parameter = new SqlParameter("@FromSystem", SqlDbType.Int);
parameter.Value = 1;
sqlcomm.Parameters.Add(parameter);
parameter = new SqlParameter("@HttpMethod", SqlDbType.VarChar, 50);
parameter.Value = string.Empty;
sqlcomm.Parameters.Add(parameter);
parameter = new SqlParameter("@Info", SqlDbType.VarChar, 50);
parameter.Value = entity.Info;
sqlcomm.Parameters.Add(parameter);
parameter = new SqlParameter("@OccurTime", SqlDbType.DateTime);
parameter.Value = entity.OccerTime;
sqlcomm.Parameters.Add(parameter);
sqlconn.Open();
sqlcomm.ExecuteNonQuery();
sqlconn.Close();
}
}
}
public class Log
{
public string ID { get; set; }
public string Info { get; set; }
public DateTime OccerTime { get; set; }
public void PrintAll()
{
Console.WriteLine("{0} {1} {2}", ID, Info, OccerTime);
}
}
為了使服務即時對MSMQ進行監控,需要我們在服務中使用一個定時事件,代碼如下:
private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
MessageQueueService.Start();
}
當然在程式初始化時,需要為一個System.Timers.Timer類型進行相應的初始化工作
this.timer1 = new System.Timers.Timer();
this.timer1.Start();
this.timer1.Interval = 1000;
this.timer1.Elapsed += new System.Timers.ElapsedEventHandler(this.timer1_Elapsed);

 

這個WINDOWS服務我們已經添加完成,現在需要做的就是MSMQ部分了,事實上windows服務這塊主要是從MSMQ中得到消息,而在MSMQ這塊主要是向MSMQ去寫入消息,微軟的MSMQ完全支援複雜類型,也就是說你可以將一個類物件寫到MSMQ中
/// <summary>
/// 日誌實體
/// 可以被序列化
/// </summary>
[Serializable()]
public sealed class Log
{
public string ID { get; set; }
public string Info { get; set; }
public DateTime OccerTime { get; set; }
}
/// <summary>
/// MSMQ消息功能密封類
/// 向訊息佇列中寫入日誌資訊
/// </summary>
public sealed class MSMQLog
{
private static object sync = new object();
private static object syncWrite = new object();
static volatile MessageQueue writer = null;
private static MessageQueue MSQWriter
{
get
{
if (writer == null)
{
lock (sync)
{
if (writer == null)
{
 
string queuePath = ".\\Private$\\zzl";
IsQueueExists(queuePath);
writer = new MessageQueue(queuePath);
}
}
}
return writer;
}
}
private static void IsQueueExists(string path)
{
if (!MessageQueue.Exists(path))
{
MessageQueue.Create(path);
}
}
public static void Write(Log log)
{
lock (syncWrite)
{
MSQWriter.Send(log);
}
}
}
16054QY7-3  

當需要調用它時,可以這樣:

本例經過自己實驗,已經成功,當若干用戶端同時進行某種操作時,可以同時寫入資料庫中,這就是我要說的,進行window服務和MSMQ技術實現高併發的解決方案。
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()