必赢网上注册-亚洲必赢官方登录

爬豆瓣音乐,作业调治

日期:2019-10-04编辑作者:必赢网上注册

1.新建项目;

如下图,基于OWIN,Web Framework 不再依靠 IIS 和 OS,那象征理论上您能够选取任何其它 Web Server 来替换 IIS,OWIN 提供了清晰的职业以便大家连忙灵活的去扩展管道来管理Http央浼,以至能够不写任何一句代码来切换分化的 Web Server,前提是这几个 Web Server 坚守 OWIN 标准。

aop和按期职分

此番更新首要扩充了审计日志还应该有集成了hangfire做定时职务

  1. 先来看审计日志部分,审计日志主借使选取了温莎的动态代理作用.每三个加多了奥迪(Audi)ted个性的方法恐怕类,在章程被调用时会输出参数和值.使用时一旦在须要审计的service上增添奥迪ted性子就能够

    [Audited]public class DemoService : LunaServiceBase, IDemoService{ public string GetMessage(string name) { Logger.Info($"GetMessage {name}"); return "测试"; } public string GetDemo(DemoModel model) { var msg = $"{model.Name}: {model.Age}"; return msg; }}
    

    还要在start上平添了一个可选参数.近年来独有贰个安装项,正是是不是张开始审讯计日志功能.假如不展开的话,标志了aduited的service也不会输出审计日志

  2. 按期职责的用法和事先的依旧有部分分化.如要反映在runner上.此前的runner要承继LunaRunnerBase,纵然利用hangfire的话要承接LunaHangfireRunnerBase.同不常间在run方法里扩展定期职责

    public class Runner : LunaHangfireRunnerBase{ public override void Run() { RecurringJob.AddOrUpdate<IJobService>(service => service.OutputLog(), Cron.Minutely); }}
    

    起步的格局照旧和事先同一的行使starter就可以.这里有好几亟需静心一下.必然要在调用starter的run方法之前布署好hangfire

    GlobalConfiguration.Configuration.UseSqlServerStorage("default");
    

    那边推荐应用topshelf之类的框架把程序搞成服务

出于职业的涉嫌不可能贴对应的源码,但在写小说时笔者会重新搭建几个demo出来供大家参谋。到最终会贴在篇章前边。

Job

Job 默许是无状态的,每一遍实行 Job ,context.JobDetail 获取到值都是固有数据,对其的另外退换都不会一蹴而就。如:我们筹划修改 JobDataMap 中的 times 属性,希望每一趟试行后都加1。

var jobDataMap = new JobDataMap();jobDataMap.Add("times", 1);

public class HelloJob : IJob{ public int Times { get; set; } public async Task Execute(IJobExecutionContext context) { context.JobDetail.JobDataMap["times"] = Times + 1; await Console.Out.WriteLineAsync($"execute {Times} times"); }}

图片 1无状态的结果

其实并不会有效,Job 注册之后,调整器内保存了这一个指标,暗中同意景况下是每一趟通过反射new八个新实例来实行的,所以每一回修改必然不会卓有效能。但咱们能够通过在 Job 类上助长 PersistJobDataAfterExecution Attribute,就能够特别轻巧的把 Job 产生有事态。

[PersistJobDataAfterExecution]public class HelloJob : IJob{ // ...}

图片 2有状态的结果

当四个 Trigger 同有的时候候触发三个 Job 恐怕 一个 Job 执行较长,Trigger 条件已经被一再接触,这种情状下,Job 就出现了产出难题。在出现情形下,数据的正确性必然会有震慑。

小编们设置 Trigger 触发周期为1s贰回,在 Job 的 Exceute 方法中投入代码:

Thread.Sleep;

图片 3现身的结果

很分明结果的一无所能的,但那时大家得以经过在 Job 类上助长 DisallowConcurrentExecution Attribute,就能够周全化解出现难题。

[DisallowConcurrentExecution]public class HelloJob : IJob{ // ...}

图片 4无出现的结果

 //html分析 //通过正则表达式获取需要的数据导出到csv MatchCollection matchs = new Regex("<p class="pl">([\s\S]*?)</p>").Matches; int count = matchs.Count; string[] input = new string[count]; for (int i = 0; i < count; i++) { input[i] = matchs[i].Result; } DataTable dt = new DataTable(); DataColumnCollection col = dt.Columns; col.Add("tag信息",typeof(System.String)); for (int i = 0; i < input.Length; i++) { DataRow row = dt.NewRow(); row["tag信息"] = input[i]; dt.Rows.Add; } //html导出csv //标准化表格形式的数据导出到csv文件 string filename = "豆瓣音乐测试导出.csv"; //创建一个文件流 FileStream fs = new FileStream(filename, System.IO.FileMode.Create, System.IO.FileAccess.Write); //创建一个文件写入对象 StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.Default); //开始导出数据 string data = ""; //写出列名称 for (int i = 0; i < dt.Columns.Count; i++) { data += dt.Columns[i].ColumnName.ToString(); //之前的需要逗号分隔,csv的默认分割符号,最后一位不要所以是count-1 if (i < dt.Columns.Count - 1) { data += ","; } } //写入一行,也就是csv的一行数据 sw.WriteLine; //写出各行数据 for (int i = 0; i < dt.Rows.Count; i++) { data = ""; for (int j = 0; j < dt.Columns.Count; j++) { //每一行数据做一下处理,去除换行的所有的分隔符也就是逗号 data += dt.Rows[i][j].ToString(); //这里和上面一样的原理 if (j < dt.Columns.Count - 1) { data += ","; } } //这里和上面的一样,写入一行 sw.WriteLine; } //写完之后关闭文件流和写入文件的对象 sw.Close(); fs.Close(); System.Console.WriteLine("完成一页tag信息采集,导出完成"); }}
说明:

Urls 参数是以 http 标准 url 为格式字符串来定义Server监听的 HostName 和 Port ,能够加多少个,表示帮衬差异的 HostName 和 Port 映射。

ServerFactory 钦赐那几个 Server 完毕类的 assembly name。通过 HttpListener 展开 Socket 端口,监听须要,然后将呼吁包装发送到OWIN管道中管理。

爬豆瓣音乐,作业调治。当 using 的尾声触发 Dispose 时 Server 被活动关闭,Server 是独立线程运转的,所以宿主进度必需驻留。

上述代码没有注重 Windows 和 IIS ,就能够不荒谬运行了。

代码

和上一版比较的话,此番入眼的更动在starter类构造函数中

private Starter(Type runnerType, StarterOption option){ Container = new WindsorContainer(); Container.Kernel.ComponentRegistered += (key, handler) => { if (option.DisableAudit) return; if (handler.ComponentModel.Implementation.IsDefined(typeof(AuditedAttribute), true)) { handler.ComponentModel.Interceptors.Add(new InterceptorReference(typeof(AuditingInterceptor))); } }; Container.Register( Classes.FromAssemblyInThisApplication(runnerType.Assembly) .IncludeNonPublicTypes() .BasedOn<ITransientDependency>() .WithServiceAllInterfaces() .If(type => !type.IsGenericTypeDefinition) .WithService.Self() .WithService.DefaultInterfaces() .LifestyleTransient; Container.Register( Classes.FromAssemblyInThisApplication(runnerType.Assembly) .IncludeNonPublicTypes() .BasedOn<ISingletonDependency>() .If(type => !type.IsGenericTypeDefinition) .WithService.Self() .WithService.DefaultInterfaces() .LifestyleSingleton; Container.Register( Classes.FromAssemblyInThisApplication(runnerType.Assembly) .IncludeNonPublicTypes() .BasedOn<IInterceptor>() .If(type => !type.IsGenericTypeDefinition) .WithService.Self() .LifestyleTransient; Container.Register( Component.For<Starter>().Instance.LifestyleSingleton;}

增加产量注册了ComponentRegistered事件.在组件注册ioc实现时检查实验了组件是还是不是申明了奥迪tedAttribute特性,假如有注脚的话就能够给组件扩张多个拦截器完结审计日志.

除此以外就是把starter自个儿也注册进了ioc,那其实是为了替换hangfire的JobActivator时接纳ioc容器.

public abstract class LunaHangfireRunnerBase : LunaRunnerBase{ private BackgroundJobServer _backgroundJobServer; public Starter Starter { get; set; } public override void Init() { base.Init(); JobActivator.Current = new WindsorJobActivator(Starter.Container.Kernel); _backgroundJobServer = new BackgroundJobServer(); } public override void Stop() { _backgroundJobServer.Dispose(); }}

能够看来LunaHangfireRunnerBase类的属性注入了starter.本来思考构造注入的,然则选拔结构注入的话,承继那么些类的runner在代码上就能够看起来不是很天真,所以舍弃了

GitHub:

此处有完整的代码和例子,没写单元测量检验大家联谊看吧.招待star

NuGet1: Install-Package Luna.Service

NuGet2: Install-Package Luna.Service.Nlog

NuGet2: Install-Package Luna.Service.Hangfire

前不久供销合作社的一个小品种尝试使用 .net core作为服务端实行开垦,并一帆风顺上线运营了一段时间,全体效应仍旧相比满足的。这里记录下总体支出进度,用于备忘和享用

参谋链接:

  • Quartz.NET Documentation
  • 案例 Demo-QuartzNetJob

3.标准表格格局的多少并导出到csv文件

图片 5OWIN的4层结构

品类供给实际上很简短,类似于一个简练的审查批准+轻便的职分处理类别,但要求同一时候有PC端和应用程式端。

JobBuilder

经过 JobBuilder 的 Create 方法,钦点三个作业职分(贰个落到实处了 IJob 接口的 Job 类)。IJob 接口唯有二个 Execute 方法,大家供给在 Execute 方法中完善大家要推行的事务代码。

IJobDetail job = JobBuilder.Create<HelloJob>() .Build();

public class HelloJob : IJob{ public async Task Execute(IJobExecutionContext context) { await Console.Out.WriteLineAsync("Hi,everybody"); }}

Execute 方法中的 context 参数包罗作业施行的装有上下文新闻,我们能够由此context 中的一些品质获取必要的数码。如:

context.Scheduler 调治器音信context.Trigger 触发器消息context.JobDetail 作业音信context.ScheduledFireTimeUtc 当前接触时间context.NextFire提姆eUtc 下三次将被触发时间......

Job 注册到 Quartz 调整器的时候供给安装贰个标记的 name,同一时候可感到 name 设置多少个组,方便大家对 Job 分类,在同一个组内的 name 必需是唯一的。若无一点名,name会自动生成,group 为 DEFAULT。

IJobDetail job = JobBuilder.Create<HelloJob>() .WithIdentity("job1", "jobGroup1"); .Build();

透过 JobBuilder 的 UsingJobData 方法大家得以为这么些 Job 设置某些附属音信,当 Job 被实践的时候,大家在 Execute 方法中经过 context.JobDetail.JobDataMap 获取这几个消息以供工作代码应用,也得以透过定义同名的性子,它将会自行注入到属性值。

var jobDataMap = new JobDataMap();jobDataMap.Add("name", "beck");IJobDetail job = JobBuilder.Create<HelloJob>() .WithIdentity("job1", "jobGroup1"); .UsingJobData(jobDataMap) .Build();

public class HelloJob : IJob{ // 映射JobDetail.JobDataMap的name public string Name { get; set; } public async Task Execute(IJobExecutionContext context) { //var name = context.JobDetail.JobDataMap["name"].ToString(); await Console.Out.WriteLineAsync($"Hi {Name}"); }}

注意:Job 和 Trigger 中都可以经过 UsingJobData 来设置从属音信,在 Execute 方法中,context.MergedJobDataMap 属性中既包涵 Job 的 DataMap,也带有 Trigger 的 DataMap。当存在同名的参数时,Trigger 会覆盖 Job 的参数值。

私下认可情形下,当 Job 未有对号入座的 Trigger 时,Job 是无法直接被投入调节器中的,恐怕在 Trigger 过期从此, 没有提到 Trigger 的 Job 也会被删除。我们得以经过 JobBuilder 的 StoreDurably 使 Job 独立存款和储蓄于调治器中。

IJobDetail job = JobBuilder.Create<HelloJob>() .WithIdentity("job1", "jobGroup1") .UsingJobData(jobDataMap) .StoreDurably() .Build();

namespace class1{class Program{static void Main(string[] args){//html下载byte[] buffer = null;System.Net.WebClient webclient = new System.Net.WebClient();buffer = webclient.DownloadData(" html = System.Text.Encoding.GetEncoding.GetString;

OWIN (Open Web Server Interface for .NET) 是三个正式和正规,OWIN 定义了Web服务器与Web应用之间的规范接口,将选取与服务器解耦,使得便携式Web应用以及跨平台的意思成为切实,标准的 OWIN 应用能够在其余 OWIN 包容的服务器上运行,不再依附与 Windows 和 IIS 。

对后端来讲,首先,项目外网是能够访谈的,得需求贰个网关;用于提供效能必要的基础服务;用于异构解耦一些数量,得要求三个MQ(后来经过Redis和Job给代表了);用于拍卖部分定时职责的Job。

步骤:

图片 6OWIN 规范约束

倘若在笔录进程中有不对路的地点依旧有越来越好的贯彻格局,迎接提出和调换。

本文由必赢网上注册发布于必赢网上注册,转载请注明出处:爬豆瓣音乐,作业调治

关键词:

ECharts柱状图恐怕折线图方法封装,VS2017利用天猫

书本上介绍的vs二零一五,这里运用vs2017,具体运用功能是大同小异的。安装好了.netcore sdk,具体使用哪个编辑器是冷...

详细>>

认清文件是不是被占用,RMB大写转化

using System;namespace Common{ public class RMB { #region 人民币大写转化 /// summary /// 转换人民币大小金额 /// /summary /// param name...

详细>>