zoukankan      html  css  js  c++  java
  • 使用windows服务更新站点地图

    由于公司平台访问人数逐渐增多,公司项目的数据库已经几次出现宕机现象。为减轻数据库压力,我上个月对公司项目做了下调整。把新闻板块提取出来单独一个站点,单独一个数据库。减少了主站点和数据库的负担和压力。

    但放在线上一个月,新闻新的发布数量最少已经有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 >页面可能发生更改的频率(选填项

    有效值为:alwayshourlydailyweeklymonthlyyearlynever

    <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服务代码:

    public partial class NPcgoNewsService : ServiceBase
        {
            Timer aTimer = new Timer();       //System.Timers,不是form的  
            public NPcgoNewsService()
            {
                InitializeComponent();
            }
    
            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):

            /// <summary>
            /// 生成百度站点地图
            /// </summary>
            /// <returns></returns>
            public void GetBaiDuSiteMap()
            {
                XmlDocument xmlDoc = new XmlDocument();
                //获取新闻站点地图的本地保存路径
                string path = Path.Combine(PublicMethods.GetAppSettings("NewsSiteMapPath"));
                xmlDoc.Load(path);
    
                //查找根节点
                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代码:

    %SystemRoot%Microsoft.NETFrameworkv4.0.30319installutil.exe GameTradingNewsService.exe
    Net Start NPCgoNewsServices
    sc config NPCgoNewsServices start= auto

    解释:

    GameTradingNewsService.exe 是windows服务项目编译以后bin文件中的exe程序的名称。
    Net Start xxx 是开启xxx服务
    NPCgoNewsServices 是windows服务名称(即:serviceInstaller1属性面板设置的服务名称(serviceName属性))
    sc config NPCgoNewsServices start= auto 是设置windows服务启动方式为自动

    卸载服务 unstall.bat代码:
    %SystemRoot%Microsoft.NETFrameworkv4.0.30319installutil.exe /u GameTradingNewsService.exe
    GameTradingNewsService.exe 是windows服务项目编译以后bin文件中的exe程序的名称

    至此,一个服务是彻底完成。



  • 相关阅读:
    curl
    jQuery监控键盘事件
    SSL证书及HTTPS服务器
    小程序中接入微信支付完整教程
    微信小程序 icon组件详细介绍
    十步解决php utf-8编码
    php正则表达式过滤空格 换行符 回车
    css单位介绍em ex ch rem vw vh vm cm mm in pt pc px
    JavaScript返回上一页并自动刷新
    php的header函数之设置content-type
  • 原文地址:https://www.cnblogs.com/woaic/p/3665643.html
Copyright © 2011-2022 走看看