由于公司平臺訪問人數逐漸增多,公司項目的數據庫已經幾次出現宕機現象。為減輕數據庫壓力,我上個月對公司項目做了下調整。把新聞板塊提取出來單獨一個站點,單獨一個數據庫。減少了主站點和數據庫的負擔和壓力。
但放在線上一個月,新聞新的發布數量最少已經有500篇左右。百度只收錄了70個左右,于是想到可能是沒有站點地圖造成的。但怎么定時更新站點地圖呢?
我嘗試使用windows服務來定時更新站點地圖。
首先需要了解下幾個問題。
1、百度收錄的站點地圖(sitemap)的格式。詳情請查看該鏈接:查看
目前我只用到了xml格式的站點地圖,就講下xml格式的站點地圖。
xml格式:
各個標簽的解釋:
<loc>www.example1.com</loc>該頁的網址。該值必須少于256個字節(必填項)。格式為<loc>您的url地址</loc>
<lastmod>2010-01-01</lastmod>該文件上次修改的日期(選填項)。格式為<lastmod>年-月-日</lastmod>
<changefreq> always </ changefreq >頁面可能發生更改的頻率(選填項) 。
有效值為:always、hourly、daily、weekly、monthly、yearly、never
<priority>1.0</priority >此網頁的優先級。有效值范圍從 0.0 到 1.0 (選填項) 。0.0優先級最低、1.0最高。
2、站點地圖更新的頻率問題
由于公司新聞更新一般時間固定在9:30-18:00。每天大概發布10――50篇新聞,所以我設想更新站點地圖的時間在:9:00――19:00,每3個小時更新一次,其他時間不做任何操作,降低數據庫查詢的負擔。
開始寫windows 服務。
1、新建windows服務,給windows起個名字
2、添加安裝程序
雙擊Service1.cs進入視圖界面,右鍵,選擇“添加安裝程序”
添加以后的效果。
serviceInstaller1:服務安裝組件。(主要用于設置 服務名稱、服務描述、服務是否開機啟動或延遲啟動、服務啟動方式等)
serviceProcessInstaller1:服務進程安裝組件(主要用戶設置運行服務的賬戶類型,如:User、LocalService、NetworkService、LocalSystem等)
serviceInstaller1的屬性設置(快捷鍵F4):
屬性說明:
DelayedAutoStart:設置是否自動啟動
Description:服務描述
ServiceName:服務名稱
StartType:啟動類型。有三種:Manual(啟動)、Automatic(自動)、Disabled(不啟動)
serviceProcessInstaller1屬性設置(快捷鍵F4):
屬性說明:
Account:運行服務的賬戶類型。有四種:User、LocalService、NetworkService、LocalSystem。
我選擇的是LocalSystem,意思是:當前系統都能運行。
3、定時觸發問題的一些需要注意的誤區。
定時觸發,大家肯定想到的是Timer組件,但一定要記住。windows服務下是沒有Timer控件的。。。。這里看到的Timer組件是不會定時觸發的,需要自己實現Timer定時觸發的事件,本人曾在此坑深陷多時。。。。
由于本人為了實現定時觸發的事件可控性和可修改性。增加了一個配置文件。配置文件添加方式如圖:
windows服務項目――右鍵――添加――新建項
配置文件設置:
4、定時windows服務代碼:
protected override void OnStart(string[] args)
{
//一個一直重寫sitemap的服務
aTimer.Elapsed += new ElapsedEventHandler(aTimer_Tick);
aTimer.Enabled = true;
aTimer.Interval = int.Parse(PublicMethods.GetAppSettings("NewsSiteUpdateTime")) * 1000; //配置文件中配置的秒數
aTimer.Start();
}
protected override void OnStop()
{
this.aTimer.Enabled = false;
this.aTimer.Stop();
}
/// <summary>
/// timer定時觸發
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void aTimer_Tick(object sender, ElapsedEventArgs e)
{
//調用該服務的時間為上午9點――下午18點,其他時間不調用
if (DateTime.Now.Hour >= 9 && DateTime.Now.Hour <= 19)
{
MakeSiteMap make = new MakeSiteMap();
make.GetBaiDuSiteMap();
}
}
}
生成百度地圖的方法(GetBaiDuSiteMap):
//查找根節點
XmlNode root = xmlDoc.SelectSingleNode("urlset");
//刪除以前的所有老節點
root.RemoveAll();
#region 平臺公告
//查詢最新100條平臺公告
List<IT_NEWS> platformnotice = GetPlatformNotice();
if (platformnotice != null && platformnotice.Count > 0 && platformnotice[0].newsId > 0)
{
foreach (IT_NEWS platformNoticeNews in platformnotice)
{
XmlElement xesub1 = xmlDoc.CreateElement("url");
XmlElement xe1 = xmlDoc.CreateElement("loc");
xe1.InnerText = "http://news.npcgo.com" + "/notice-" + platformNoticeNews.newsType + "-" + platformNoticeNews.newsId + ".html";
XmlElement xe2 = xmlDoc.CreateElement("lastmod");
xe2.InnerText = Convert.ToDateTime(platformNoticeNews.newsCreateTime).ToString("yyyy-MM-dd");
XmlElement xe3 = xmlDoc.CreateElement("changefreq");
xe3.InnerText = "daily";
XmlElement xe4 = xmlDoc.CreateElement("priority");
xe4.InnerText = "0.2";
xesub1.AppendChild(xe1);
xesub1.AppendChild(xe2);
xesub1.AppendChild(xe3);
xesub1.AppendChild(xe4);
root.AppendChild(xesub1);
}
}
#endregion
xmlDoc.AppendChild(root);
xmlDoc.Save(path);
}
安裝windows服務:
需要寫一個windows服務安裝的批處理和卸載的批處理,都放在windows服務項目的bin/Debug文件夾下。
安裝服務,install.bat代碼:
解釋:
GameTradingNewsService.exe 是windows服務項目編譯以后bin文件中的exe程序的名稱。
Net Start xxx 是開啟xxx服務
NPCgoNewsServices 是windows服務名稱(即:serviceInstaller1屬性面板設置的服務名稱(serviceName屬性))
sc config NPCgoNewsServices start= auto 是設置windows服務啟動方式為自動
卸載服務 unstall.bat代碼:
至此,一個服務是徹底完成。
新聞熱點
疑難解答