• 使用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程序的名称

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



  • 相关阅读:
    JS BOM对象 History对象 Location对象
    JS 字符串对象 数组对象 函数对象 函数作用域
    JS 引入方式 基本数据类型 运算符 控制语句 循环 异常
    Pycharm Html CSS JS 快捷方式创建元素
    CSS 内外边距 float positio属性
    CSS 颜色 字体 背景 文本 边框 列表 display属性
    【Android】RxJava的使用(三)转换——map、flatMap
    【Android】RxJava的使用(二)Action
    【Android】RxJava的使用(一)基本用法
    【Android】Retrofit 2.0 的使用
  • 原文地址:https://www.cnblogs.com/woaic/p/3665643.html
Copyright © 2020-2023  润新知