• Community Server 作业系统


            作业系统是使用Timer对象使背景程序定期运行的一个框架,CS利用作业系统建立搜索索引等操作。CS的作业系统具有可配置性和可扩展性的优点,你很容易使用它创建更多的作业。

            首先,作业的启动和停止需要在程序的启动和关闭进行,所以要有一个Module进行注册,在CS里就写在CSHttpModule中了。
    public class CSHttpModule : IHttpModule
    {
            
    public void Init(HttpApplication application)
            
    {
                Jobs.Instance().Start();
    //作业启动
            }

            
            
    public void Dispose()
            
    {
                Jobs.Instance().Stop(); 
    //用业关闭
            }

    }

            作业系统需要几个类相互配合进行工作,分别是:Jobs、Job、IJob和实际IJob的工作类,如:PostAttachmentCleanupJob等。

            Jobs类的Start()方法用于提取communityserver.config中设置作业列表,并实例化出对应的Job对象列表,在Job对象的InitializeTimer()期间,作业就会被启动,如果作业配置中使用了"singleThread = false",则作业会在单独的Timer对象中启动,可以设置自已的间隔时间,否则作业会在统一的一个Timer对象中启动,间隔时间都是统一的,默认情况下间隔时间为15分钟,可以通过配置minutes设置间隔时间。
            Timer对象在实例化过程中会调用一个委托对象,用于循环作业时间,如:
    singleTimer = new Timer(new TimerCallback(call_back),null,Interval, Interval);
    在call_back方法中,会循环设置作业的下一个运行时间:
            private void call_back(object state)
            
    {
                _isRunning 
    = true;
                _started 
    = DateTime.Now;
                singleTimer.Change( Timeout.Infinite, Timeout.Infinite );
             
                
    foreach(Job job in jobList.Values)
                
    {
                    
    if(job.Enabled && job.SingleThreaded)
                    
    {
                        job.ExecuteJob();
                    }

                }


                singleTimer.Change( Interval, Interval);
                _isRunning 
    = false;
                _completed 
    = DateTime.Now;
            }
    其中singleTimer.Change( Timeout.Infinite, Timeout.Infinite );表明必须完成作业指定的任务,才会开始下一个循环。

            Job对象是存储一些配置信息和单独启动Timer对象。
            IJob接口定义了使用作业系统的作业类必须实现的方法void Execute(XmlNode node);实现IJob接口的作业类从参数XmlNode node提取一些有用的配置信息,则可以有助于作业的运行。如:PostAttachmentCleanupJob类
        public class PostAttachmentCleanupJob : IJob
        
    {
            
    public PostAttachmentCleanupJob()
            
    {
            }


            
    public void Execute(XmlNode node)
            
    {
                XmlAttribute expiresAfterHoursNode 
    = node.Attributes["expiresAfterHours"];
                
    int expiresAfterHours = 2;

                
    if(expiresAfterHoursNode != null)
                
    {
                    
    try { expiresAfterHours = int.Parse(expiresAfterHoursNode.Value); }
                    
    catch { expiresAfterHours = 2; }
                }


                CommonDataProvider dp 
    = CommonDataProvider.Instance();
                dp.ExpireTemporaryPostAttachments(DateTime.Now.AddHours(
    -expiresAfterHours));
            }

        }
    通过获取节点expiresAfterHours的值可以设置清除提定时间前的临时附件。如果你要定义一个新的作业,则只需添加一个作业类并实现IJob接口,并写在配置文件中。
  • 相关阅读:
    连接mysql遇到的问题
    洛谷 P3369 【模板】普通平衡树(Treap/SBT)
    开博啦
    luogu【P2753】[USACO4.3]字母游戏Letter Game
    luogu【P3377】 【模板】左偏树
    POJ-2251
    HDU-1518
    Coderforces-455A
    UVA-1608
    Coderfocers-551C
  • 原文地址:https://www.cnblogs.com/chenjunbiao/p/1760248.html
Copyright © 2020-2023  润新知