加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 资源网站 > 资源 > 正文

在Web微信应用中使用博客园RSS以及Quartz.NET实现博客文章内容的

发布时间:2020-12-14 19:47:22 所属栏目:资源 来源:网络整理
导读:本篇随笔介绍在Web微信应用中使用博客园RSS以及Quartz.NET实现博客文章内容的定期推送功能,首先对Quartz.NET进行一个简单的介绍和代码分析,掌握对作业调度的处理,然后对博客园RSS内容的处理如何获取,并结合微信消息的群发接口进行内容的发送,从而构建了
表达式 </tr>
<tr>
<td>0 15 10 ? </td>
<td>每天上午10:15触发</td>

</tr>
<tr>
<td>0 15 10 ?</td>
<td>每天上午10:15触发</td>

</tr>
<tr>
<td>0 15 10 ? *</td>
<td>每天上午10:15触发</td>

</tr>
<tr>
<td>0 15 10 ? 2005</td>
<td>2005年的每天上午10:15触发</td>

</tr>
<tr>
<td>0 14 * ?</td>
<td>在每天下午2点到下午2:59期间的每1分钟触发</td>

</tr>
<tr>
<td>0 0/5 14 ?</td>
<td>在每天下午2点到下午2:55期间的每5分钟触发</td>

</tr>
<tr>
<td>0 0/5 14,18 ?</td>
<td>在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发</td>

</tr>
<tr>
<td>0 0-5 14 ?</td>
<td>在每天下午2点到下午2:05期间的每1分钟触发</td>

</tr>
<tr>
<td>0 10,44 14 ? 3 WED</td>
<td>每年三月的星期三的下午2:10和2:44触发</td>

</tr>
<tr>
<td>0 15 10 ? * MON-FRI</td>
<td>周一至周五的上午10:15触发</td>

</tr>
<tr>
<td>0 15 10 15 * ?</td>
<td>每月15日上午10:15触发</td>

</tr>
<tr>
<td>0 15 10 L * ?</td>
<td>每月最后一日的上午10:15触发</td>

</tr>
<tr>
<td>0 15 10 L-2 * ?</td>
<td>Fire at 10:15am on the 2nd-to-last last day of every month</td>

</tr>
<tr>
<td>0 15 10 ? * 6L</td>
<td>每月的最后一个星期五上午10:15触发</td>

</tr>
<tr>
<td>0 15 10 ? * 6L</td>
<td>Fire at 10:15am on the last Friday of every month</td>

</tr>
<tr>
<td>0 15 10 ? * 6L 2002-2005</td>
<td>2002年至2005年的每月的最后一个星期五上午10:15触发</td>

</tr>
<tr>
<td>0 15 10 ? * 6#3</td>
<td>每月的第三个星期五上午10:15触发</td>

</tr>
<tr>
<td>0 0 12 1/5 * ?</td>
<td>Fire at 12pm (noon) every 5 days every month,starting on the first day of the month.</td>

</tr>
<tr>
<td>0 11 11 11 11 ?</td>
<td>Fire every November 11th at 11:11am.
</td>

</tr>

3、Quartz.NET的应用案例

我曾经在统一接口的Web API后台,使用了这个Quartz.NET来实现站场信息的同步处理,这样可以把其他供应商提供的接口数据,同步到本地,可以加快数据的检索和处理效率。

具体代码如下所示。

首先是在Global.asax的后台代码里面进行同步代码处理。

= </span><span style="color: #0000ff;"&gt;protected</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; Application_Start() { GlobalConfiguration.Configuration.EnableCors(); GlobalConfiguration.Configure(WebApiConfig.Register); </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;创建执行同步的处理</span> ISchedulerFactory sf = <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; StdSchedulerFactory(); scheduler </span>=<span style="color: #000000;"&gt; sf.GetScheduler(); CalendarTask(); CreateOnceJob(); </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;启动所有的任务</span>

<span style="color: #000000;"> scheduler.Start();
}
<span style="color: #0000ff;">protected <span style="color: #0000ff;">void Application_End(<span style="color: #0000ff;">object<span style="color: #000000;"> sender,EventArgs e)
{
<span style="color: #0000ff;">if(scheduler != <span style="color: #0000ff;">null<span style="color: #000000;">)
{
scheduler.Shutdown(<span style="color: #0000ff;">true<span style="color: #000000;">);
}
}

    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;<summary></span>
    <span style="color: #808080;"&gt;///</span><span style="color: #008000;"&gt; 创建同步任务
    </span><span style="color: #808080;"&gt;///</span> <span style="color: #808080;"&gt;</summary></span>
    <span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; CalendarTask()
    {
        IJobDetail job </span>= JobBuilder.Create<StationSyncJob><span style="color: #000000;"&gt;()
             .WithIdentity(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;StationSyncJob</span><span style="color: #800000;"&gt;"</span>,<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;group1</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)
             .Build();

        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;每天凌晨1点执行一次:0 0 1 * * ?</span>
        ICronTrigger trigger =<span style="color: #000000;"&gt; (ICronTrigger)TriggerBuilder.Create()
                                                  .WithIdentity(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;trigger1</span><span style="color: #800000;"&gt;"</span>,<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;group1</span><span style="color: #800000;"&gt;"</span>)       <span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;"0 34,36,38,40 * * * ?"</span>
                                                  .WithCronSchedule(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;0 0 1 * * ?</span><span style="color: #800000;"&gt;"</span>)<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;"0 0 1 * * ?"</span>

<span style="color: #000000;"> .Build();

        DateTimeOffset ft </span>=<span style="color: #000000;"&gt; scheduler.ScheduleJob(job,trigger);
        LogTextHelper.Info(</span><span style="color: #0000ff;"&gt;string</span>.Format(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;您在 {0} 时候创建了Quartz任务</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;,DateTime.Now));
    }

    </span><span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; CreateOnceJob()
    {
        IJobDetail onceJob </span>= JobBuilder.Create<StationSyncJob><span style="color: #000000;"&gt;()
                             .WithIdentity(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;onceJob</span><span style="color: #800000;"&gt;"</span>,<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;group1</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)
                             .Build();
        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;启动的时候运行一次</span>
        DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(<span style="color: #0000ff;"&gt;null</span>,<span style="color: #800080;"&gt;30</span><span style="color: #000000;"&gt;);
        ISimpleTrigger simpleTrigger </span>=<span style="color: #000000;"&gt; (ISimpleTrigger)TriggerBuilder.Create()
                                                      .WithIdentity(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;simpleOnce</span><span style="color: #800000;"&gt;"</span>,<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;group1</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)
                                                      .StartAt(startTime)
                                                      .Build();
        DateTimeOffset ft </span>=<span style="color: #000000;"&gt; scheduler.ScheduleJob(onceJob,simpleTrigger);
    }

}</span></pre>

其中同步站场信息的Job实现如下所示(这里是通过调用第三方接口获取数据,然后把它们保存到本地,这个定时服务设定在每天的一个是时间点上执行,如凌晨1点时刻)。

.Format( StationDetailResult result </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; StationDetailResult(); </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt; { QueryStationJson json </span>= <span style="color: #0000ff;"&gt;new</span> QueryStationJson();<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;空查询,一次性查询所有</span>

<span style="color: #000000;">
BaseDataAgent agent = <span style="color: #0000ff;">new<span style="color: #000000;"> BaseDataAgent();
result =<span style="color: #000000;"> agent.QueryStationDetail(json);
<span style="color: #0000ff;">if(result != <span style="color: #0000ff;">null &&<span style="color: #000000;"> result.success)
{
<span style="color: #0000ff;">foreach(StationDetailJson detail <span style="color: #0000ff;">in<span style="color: #000000;"> result.data)
{
StationInfo info =<span style="color: #000000;"> detail.ConvertInfo();
<span style="color: #0000ff;">try<span style="color: #000000;">
{
BLLFactory<span style="color: #000000;">.Instance.InsertIfNew(info);
}
<span style="color: #0000ff;">catch<span style="color: #000000;">(Exception ex)
{
LogTextHelper.Error(ex);
LogTextHelper.Info(info.ToJson());
}
}
}
}
<span style="color: #0000ff;">catch<span style="color: #000000;"> (Exception ex)
{
result.errmsg =<span style="color: #000000;"> ex.Message;
result.success = <span style="color: #0000ff;">false<span style="color: #000000;">;

            LogTextHelper.Error(ex);
        }
    }
}</span></pre>

4、博客的RSS

原则上我们可以利用任何RSS来源来获取响应的博客内容,这里我以自己博客园的RSS源进行介绍使用,我们每个博客园的账号都有一个如下的连接,提供我们最新的博客列表信息。

打开连接,可以看到它的内容就是最新显示的博客内容,如下所示

?

处理RSS的内容,我们使用内置的SyndicationFeed对象来处理即可,非常方便。

url = ==

上面代码就是获取到对应的RSS内容,然后把它们转换为XMLReader进行解析即可。

然后可以通过一个遍历的处理就可以获取到其中各个的XML节点内容了,非常方便。

(SyndicationItem item id = subject = summary =

5、在微信应用中发送博客内容

通过上面的RSS读取操作,我们可以获得对应的博客内容,如果我们需要每周给客户发送一些内容,那么这些就可以通过上面RSS源进行处理发送了。

关于发送文本消息的处理,可以参考我的随笔文章《》

这里我就直接应用上面的接口对内容进行处理发送,具体接口的逻辑就不再罗列。

url = == ICustomerApi api </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; CustomerApi(); </span><span style="color: #0000ff;"&gt;foreach</span> (SyndicationItem item <span style="color: #0000ff;"&gt;in</span><span style="color: #000000;"&gt; feed.Items) { Console.WriteLine(item.ToJson()); </span><span style="color: #0000ff;"&gt;var</span> id =<span style="color: #000000;"&gt; item.Id; </span><span style="color: #0000ff;"&gt;string</span> subject =<span style="color: #000000;"&gt; item.Title.Text; </span><span style="color: #0000ff;"&gt;string</span> summary =<span style="color: #000000;"&gt; item.Summary.Text; </span><span style="color: #0000ff;"&gt;var</span> content = <span style="color: #0000ff;"&gt;string</span>.Format(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;<a href='{0}'>{1}</a></span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;,id,subject); CommonResult result </span>=<span style="color: #000000;"&gt; api.SendText(token,openId,content); Console.WriteLine(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;发送内容:</span><span style="color: #800000;"&gt;"</span> + (result.Success ? <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;成功</span><span style="color: #800000;"&gt;"</span> : <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;失败:</span><span style="color: #800000;"&gt;"</span> +<span style="color: #000000;"&gt; result.ErrorMessage)); } }</span></pre>

得到的界面效果如下所示。

但是这样的效果还是有点差强人意,我们知道微信里面有图文消息的接口,可以利用图文消息的接口进行发送,则更加美观一些。

调整后的代码如下所示。

list = List </span><span style="color: #0000ff;"&gt;string</span> url = <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;http://feed.cnblogs.com/blog/u/12391/rss</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;; XmlReader reader </span>=<span style="color: #000000;"&gt; XmlReader.Create(url); SyndicationFeed feed </span>=<span style="color: #000000;"&gt; SyndicationFeed.Load(reader); reader.Close(); </span><span style="color: #0000ff;"&gt;int</span> i = <span style="color: #800080;"&gt;0</span><span style="color: #000000;"&gt;; </span><span style="color: #0000ff;"&gt;foreach</span> (SyndicationItem item <span style="color: #0000ff;"&gt;in</span><span style="color: #000000;"&gt; feed.Items) { list.Add( </span><span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; ArticleEntity { Title </span>=<span style="color: #000000;"&gt; item.Title.Text,Description </span>=<span style="color: #000000;"&gt; item.Summary.Text,PicUrl </span>= i == <span style="color: #800080;"&gt;0</span> ? <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;http://www.iqidi.com/Content/Images/cnblogs_whc.png</span><span style="color: #800000;"&gt;"</span> : <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;http://www.iqidi.com/Content/Images/frame_web.png</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;,Url </span>=<span style="color: #000000;"&gt; item.Id }); </span><span style="color: #0000ff;"&gt;if</span>(i >= <span style="color: #800080;"&gt;8</span><span style="color: #000000;"&gt;) { </span><span style="color: #0000ff;"&gt;break</span><span style="color: #000000;"&gt;; } i</span>++<span style="color: #000000;"&gt;; } ICustomerApi customerApi </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; CustomerApi(); </span><span style="color: #0000ff;"&gt;var</span> result =<span style="color: #000000;"&gt; customerApi.SendNews(token,list); }</span></pre>

这样就是发送图文消息的代码,需要重新构建一个实体类集合进行发送,得到发送的效果如下所示。

整体的界面效果就是我们需要的效果了,不过如果我们需要使用批量发送给订阅用户的话,那么我们需要使用消息的群发接口,群发的消息接口封装如需了解,可以参考文章《》。

整个群发消息的逻辑代码如下所示,主要逻辑就是获取博客文章,并上传文章的图片,接着上传需要群发的图文消息资源,最后调用群发接口进行消息的发送即可。

list = List </span><span style="color: #0000ff;"&gt;string</span> url = <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;http://feed.cnblogs.com/blog/u/12391/rss</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;; XmlReader reader </span>=<span style="color: #000000;"&gt; XmlReader.Create(url); SyndicationFeed feed </span>=<span style="color: #000000;"&gt; SyndicationFeed.Load(reader); reader.Close(); </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;上传图片获取MediaId</span> IMediaApi mediaApi = <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; MediaApi(); </span><span style="color: #0000ff;"&gt;var</span> result1 = mediaApi.UploadTempMedia(token,UploadMediaFileType.image,<span style="color: #800000;"&gt;@"</span><span style="color: #800000;"&gt;E:我的网站资料iqidiSoftwarecontentimagescnblogs_whc.png</span><span style="color: #800000;"&gt;"</span>);<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;"</span><span style="color: #008000; text-decoration: underline;"&gt;http://www.iqidi.com/Content/Images/cnblogs_whc.png</span><span style="color: #008000;"&gt;");</span> <span style="color: #0000ff;"&gt;var</span> result2 = mediaApi.UploadTempMedia(token,<span style="color: #800000;"&gt;@"</span><span style="color: #800000;"&gt;E:我的网站资料iqidiSoftwarecontentimagesframe_web.png</span><span style="color: #800000;"&gt;"</span>);<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;"</span><span style="color: #008000; text-decoration: underline;"&gt;http://www.iqidi.com/Content/Images/frame_web.png</span><span style="color: #008000;"&gt;");</span> <span style="color: #0000ff;"&gt;if</span> (result1 != <span style="color: #0000ff;"&gt;null</span> &amp;&amp; result2 != <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;) { </span><span style="color: #0000ff;"&gt;int</span> i = <span style="color: #800080;"&gt;0</span><span style="color: #000000;"&gt;; </span><span style="color: #0000ff;"&gt;foreach</span> (SyndicationItem item <span style="color: #0000ff;"&gt;in</span><span style="color: #000000;"&gt; feed.Items) { list.Add( </span><span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; NewsUploadJson { author </span>= <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;伍华聪</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;,title </span>=<span style="color: #000000;"&gt; item.Title.Text,content </span>=<span style="color: #000000;"&gt; item.Summary.Text,</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;digest = item.Summary.Text,</span> thumb_media_id = i == <span style="color: #800080;"&gt;0</span> ?<span style="color: #000000;"&gt; result1.media_id : result2.media_id,content_source_url </span>=<span style="color: #000000;"&gt; item.Id,}); </span><span style="color: #0000ff;"&gt;if</span> (i >= <span style="color: #800080;"&gt;8</span><span style="color: #000000;"&gt;) { </span><span style="color: #0000ff;"&gt;break</span><span style="color: #000000;"&gt;; } i</span>++<span style="color: #000000;"&gt;; } } </span><span style="color: #0000ff;"&gt;if</span> (list.Count > <span style="color: #800080;"&gt;0</span><span style="color: #000000;"&gt;) { UploadJsonResult resultNews </span>=<span style="color: #000000;"&gt; mediaApi.UploadNews(token,list); </span><span style="color: #0000ff;"&gt;if</span> (resultNews != <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;) { IMassSendApi massApi </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; MassSendApi(); </span><span style="color: #0000ff;"&gt;var</span> result = massApi.SendByGroup(token,MassMessageType.mpnews,resultNews.media_id,<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;0</span><span style="color: #800000;"&gt;"</span>,<span style="color: #0000ff;"&gt;true</span><span style="color: #000000;"&gt;); } </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt; { Console.WriteLine(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;上传图文消息失败</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;); } } }</span></pre>

群发的消息在微信上看到内容和前面的差不多,不过点击并不会直接跳转链接,而是进去到一个详细内容的页面里面,只有单击阅读原文才进行跳转URL,如下所示。

6.结合Quartz.NET实现博客文章内容的定期推送功能

在Web微信应用中使用博客RSS以及Quartz.NET实现文章内容的定期推送功能,我们需要结合Quartz.NET的作业调度处理、微信接口的内容发送,以及博文RSS内容的获取处理,三者整合进行实现整个功能。

首先我们根据上面的代码,设计好调度的Job内容,如下所示。

然后,在Web应用的Global.asa的后台代码里面,编写代码启动作业调度即可。

而根据前面Corn表达式的说明,我们要每周定时发送一次的的规则,如下所示。

每周星期天凌晨1点实行一次:?0 0 1 ? * L

这样我们最终的Globa.asa后台代码如下所示。

IScheduler scheduler = </span><span style="color: #0000ff;"&gt;void</span> Application_Start(<span style="color: #0000ff;"&gt;object</span><span style="color: #000000;"&gt; sender,EventArgs e) { </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 在应用程序启动时运行的代码</span>

<span style="color: #000000;"> AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);

        BundleConfig.RegisterBundles(BundleTable.Bundles);


        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;构造调度对象,并创建对应的调度任务</span>

<span style="color: #ff0000;"> scheduler = StdSchedulerFactory.GetDefaultScheduler();
CalendarTask();

        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;启动所有的任务</span>

<span style="color: #000000;"><span style="color: #ff0000;"> scheduler.Start();
}

    </span><span style="color: #0000ff;"&gt;protected</span> <span style="color: #0000ff;"&gt;void</span> Application_End(<span style="color: #0000ff;"&gt;object</span><span style="color: #000000;"&gt; sender,EventArgs e)
    {
        </span><span style="color: #0000ff;"&gt;if</span> (scheduler != <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;)
        {
            scheduler.Shutdown(</span><span style="color: #0000ff;"&gt;true</span><span style="color: #000000;"&gt;);
        }
    }


    </span><span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; CalendarTask()
    {
        IJobDetail job </span>= JobBuilder.Create<BlogArticleSendJob><span style="color: #000000;"&gt;()
             .WithIdentity(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;BlogArticleSendJob</span><span style="color: #800000;"&gt;"</span>,<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;group1</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)
             .Build();

        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;每周星期天凌晨1点实行一次:0 0 1 ? * L</span>
        ICronTrigger trigger =<span style="color: #000000;"&gt; (ICronTrigger)TriggerBuilder.Create()
                                                  .WithIdentity(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;trigger1</span><span style="color: #800000;"&gt;"</span>,<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;group1</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)
                                                  .WithCronSchedule(</span><span style="color: #800000;"&gt;"</span><span style="color: #ff0000;"&gt;0 0 1 ? * L</span><span style="color: #800000;"&gt;"</span>)<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;0 0 1 ? * L</span>

<span style="color: #000000;"> .Build();

        DateTimeOffset ft </span>=<span style="color: #000000;"&gt; scheduler.ScheduleJob(job,DateTime.Now));
    }</span></pre>

综合上面的思路,我们可以利用Quartz.NET做成更多的数据同步任务调度,另外在微信应用中,我们也可以整合很多组件或者控件,来实现更加弹性化的业务支持,如消息群发、访客汇总,内容同步等处理。

以上就是我的一些组件代码的应用思路,其实我们只要涉猎更广一些,很多东西可以使用拿来主义,经过自己的整合优化,可以为我们服务的更好。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

本篇随笔介绍在Web微信应用中使用博客园RSS以及Quartz.NET实现博客文章内容的定期推送功能,首先对Quartz.NET进行一个简单的介绍和代码分析,掌握对作业调度的处理,然后对博客园RSS内容的处理如何获取,并结合微信消息的群发接口进行内容的发送,从而构建了一个在Web应用中利用作业调度来进行消息发送的业务模型。

Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等。?Quartz.NET允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz.NET的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。

Quartz框架的一些基础概念解释:

?  Scheduler ? ? 作业调度器。

?  IJob ? ? ? ? ? ? 作业接口,继承并实现Execute,?编写执行的具体作业逻辑。

  JobBuilder ? ? ? 根据设置,生成一个详细作业信息(JobDetail)。

  TriggerBuilder ? 根据规则,生产对应的Trigger

官方的使用案例代码如下所示

button1_Click(= Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter { Level = </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; Grab the Scheduler instance from the Factory </span> IScheduler scheduler =<span style="color: #000000;"&gt; StdSchedulerFactory.GetDefaultScheduler(); </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; and start it off</span>

<span style="color: #000000;"> scheduler.Start();

            </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; define the job and tie it to our HelloJob class</span>
            IJobDetail job = JobBuilder.Create<HelloJob><span style="color: #000000;"&gt;()
                .WithIdentity(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;job1</span><span style="color: #800000;"&gt;"</span>,<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;group1</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)
                .Build();

            </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; Trigger the job to run now,and then repeat every 10 seconds</span>
            ITrigger trigger =<span style="color: #000000;"&gt; TriggerBuilder.Create()
                .WithIdentity(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;trigger1</span><span style="color: #800000;"&gt;"</span>,<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;group1</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)
                .StartNow()
                .WithSimpleSchedule(x </span>=><span style="color: #000000;"&gt; x
                    .WithIntervalInSeconds(</span><span style="color: #800080;"&gt;10</span><span style="color: #000000;"&gt;)
                    .RepeatForever())
                .Build();

            </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; Tell quartz to schedule the job using our trigger</span>

<span style="color: #000000;"> scheduler.ScheduleJob(job,trigger);

            </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; some sleep to show what's happening</span>
            Thread.Sleep(TimeSpan.FromSeconds(<span style="color: #800080;"&gt;60</span><span style="color: #000000;"&gt;));

            </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; and last shut down the scheduler when you are ready to close your program</span>

<span style="color: #000000;"> scheduler.Shutdown();
}
<span style="color: #0000ff;">catch<span style="color: #000000;"> (SchedulerException se)
{
Console.WriteLine(se);
}

        Console.WriteLine(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;Finished</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;);
    }</span></pre>

?启动定义一个HelloJOb的对象,如下代码所示

<h3 id="autoid-4-1-2">2、Quartz的cron表达式

cron expressions 整体上还是非常容易理解的,只有一点需要注意:"?"号的用法,看下文可以知道“?”可以用在 day of month 和 day of week中,他主要是为了解决如下场景,如:每月的1号的每小时的31分钟,正确的表达式是:* 31 * 1 * ?,而不能是:* 31 * 1 * *,因为这样代表每周的任意一天。

由7段构成:秒 分 时 日 月 星期 年(可选)"-" :表示范围? MON-WED表示星期一到星期三"," :表示列举 MON,WEB表示星期一和星期三"*" :表是“每”,每月,每天,每周,每年等"/" :表示增量:0/15(处于分钟段里面) 每15分钟,在0分以后开始,3/20 每20分钟,从3分钟以后开始"?" :只能出现在日,星期段里面,表示不指定具体的值"L" :只能出现在日,星期段里面,是Last的缩写,一个月的最后一天,一个星期的最后一天(星期六)"W" :表示工作日,距离给定值最近的工作日"#" :表示一个月的第几个星期几,例如:"6#3"表示每个月的第三个星期五(1=SUN...6=FRI,7=SAT)

官方cron表达式实例

<table style="height: 455px; width: 1050px;">

代表意义
    推荐文章
      热点阅读