设置一个 MVC ASP.NET 应用程序来执行计划任务 - 实现方法?
Setting an MVC ASP.NET application to do scheduled tasks - Method to achieve it?
我正在构建一个将从 xml 提要中获取数据的网站。我将其构建为 MVC AP.NET 应用程序。例如,我需要应用程序每 2 分钟从位于提供商服务器上的 xml 文件中获取数据。然后将存储这些数据。
我的问题是,我希望从网站上传到服务器的那一刻起,这些过程就可以不间断地完成。我正在考虑在主要方法(?)中使用计时器每 2 分钟获取一次数据。但我在这里搜索了其他主题,发现使用 AppFabric 是解决方案。问题是我是一个绝对的初学者,我发现它很难使用......是否有其他更简单的方法来实现从xml文件中持续更新数据?
我建议您使用 Quartz 来处理调度,而不是使用内置计时器。我在最近的两个项目中使用了 Quartz,给我留下了深刻的印象。它可以处理您能想到的任何时间表。
http://www.quartz-scheduler.net/documentation/quartz-2.x/quick-start.html
创造就业机会的例子:
using Quartz;
using Quartz.Impl;
IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
scheduler.Start();
IJobDetail integrationJob = JobBuilder.Create<IntegrationJob>().Build();
ITrigger integrationTrigger = TriggerBuilder.Create()
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(300).RepeatForever()).Build();
scheduler.ScheduleJob(integrationJob, integrationTrigger);
public class IntegrationJob : Ijob
{
public void Execute(IJobExecutionContext context)
{
//Write code for job
}
}
另一种更简单、更直接的方法是在您的 Visual Studio 解决方案中创建一个控制台项目,然后让 Windows 任务计划程序启动它。为此,您的解决方案中至少需要包含以下三个项目:
- 一个 Class 包含领域模型和存储库的库项目 classes
- ASP.NET MVC 网络应用程序(引用领域模型项目)
- 控制台项目(引用领域模型项目)
理想情况下,您会坚持领域驱动设计,这样您的业务逻辑就会封装在您的领域模型中,因此可以在您的 Web 应用程序和控制台应用程序之间移植。
真的,我会为任何可能不仅仅是网络应用程序的项目推荐此解决方案设置:
MyApp.Models
:一个 Class 领域模型库和存储库 classes。利用 Domain Driven Design and the Repository Pattern 使核心业务逻辑和对持久存储的访问在 VS 项目之间可移植
MyApp.Models.Tests
:模型的单元测试class 库
MyApp.Web
: MVC 或 WebForms 项目
MyApp.Web.Tests
:您的 Web 项目的单元和功能测试。
- 单元测试:使用您最喜欢的测试 运行ner(MS 测试、NUnit、xUnit 等)
- 功能测试:CodedUI tests from Microsoft or WatiN allow you to drive the web browser programmatically. I would also recommend SpecFlow for those who want to do Behavior Driven Development
MyApp.Console
: 可以运行作为后台作业的控制台应用程序
MyApp.Console.Tests
:控制台应用程序的单元测试
我知道这似乎有点矫枉过正,但根据我的经验,随着时间的推移,项目似乎总是倾向于这种结构。考虑到这种结构来构建项目很容易,并且会为您提供很大的灵活性,因为业务不可避免地会陷入疯狂,并要求您的应用程序做除了煮咖啡以外的所有事情(毕竟,这就是实习生的工作!)。 =18=]
您可能想研究使用 Hangfire。它可以让您安排任务,并为您提供一个漂亮的仪表板来管理任务。您可以在 NuGet 中找到它,并且 Hangfire 站点上的文档非常好。
它非常易于使用,这里是一个示例,说明如果您想每分钟 运行 一个作业,您必须添加到 OWIN 启动程序 class 中:
public void Configuration(IAppBuilder app)
{
app.UseHangfire(config =>
{
config.UseSqlServerStorage("connection string");
config.UseServer();
});
InitializeJobs();
}
public static void InitializeJobs()
{
RecurringJob.AddOrUpdate("jobName", () => CallToJobFunction(), Cron.Minutely);
}
查看 hanselman 的博客,他在其中讨论了这个主题:
http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx
我正在构建一个将从 xml 提要中获取数据的网站。我将其构建为 MVC AP.NET 应用程序。例如,我需要应用程序每 2 分钟从位于提供商服务器上的 xml 文件中获取数据。然后将存储这些数据。 我的问题是,我希望从网站上传到服务器的那一刻起,这些过程就可以不间断地完成。我正在考虑在主要方法(?)中使用计时器每 2 分钟获取一次数据。但我在这里搜索了其他主题,发现使用 AppFabric 是解决方案。问题是我是一个绝对的初学者,我发现它很难使用......是否有其他更简单的方法来实现从xml文件中持续更新数据?
我建议您使用 Quartz 来处理调度,而不是使用内置计时器。我在最近的两个项目中使用了 Quartz,给我留下了深刻的印象。它可以处理您能想到的任何时间表。
http://www.quartz-scheduler.net/documentation/quartz-2.x/quick-start.html
创造就业机会的例子:
using Quartz;
using Quartz.Impl;
IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
scheduler.Start();
IJobDetail integrationJob = JobBuilder.Create<IntegrationJob>().Build();
ITrigger integrationTrigger = TriggerBuilder.Create()
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(300).RepeatForever()).Build();
scheduler.ScheduleJob(integrationJob, integrationTrigger);
public class IntegrationJob : Ijob
{
public void Execute(IJobExecutionContext context)
{
//Write code for job
}
}
另一种更简单、更直接的方法是在您的 Visual Studio 解决方案中创建一个控制台项目,然后让 Windows 任务计划程序启动它。为此,您的解决方案中至少需要包含以下三个项目:
- 一个 Class 包含领域模型和存储库的库项目 classes
- ASP.NET MVC 网络应用程序(引用领域模型项目)
- 控制台项目(引用领域模型项目)
理想情况下,您会坚持领域驱动设计,这样您的业务逻辑就会封装在您的领域模型中,因此可以在您的 Web 应用程序和控制台应用程序之间移植。
真的,我会为任何可能不仅仅是网络应用程序的项目推荐此解决方案设置:
MyApp.Models
:一个 Class 领域模型库和存储库 classes。利用 Domain Driven Design and the Repository Pattern 使核心业务逻辑和对持久存储的访问在 VS 项目之间可移植MyApp.Models.Tests
:模型的单元测试class 库MyApp.Web
: MVC 或 WebForms 项目MyApp.Web.Tests
:您的 Web 项目的单元和功能测试。- 单元测试:使用您最喜欢的测试 运行ner(MS 测试、NUnit、xUnit 等)
- 功能测试:CodedUI tests from Microsoft or WatiN allow you to drive the web browser programmatically. I would also recommend SpecFlow for those who want to do Behavior Driven Development
MyApp.Console
: 可以运行作为后台作业的控制台应用程序MyApp.Console.Tests
:控制台应用程序的单元测试
我知道这似乎有点矫枉过正,但根据我的经验,随着时间的推移,项目似乎总是倾向于这种结构。考虑到这种结构来构建项目很容易,并且会为您提供很大的灵活性,因为业务不可避免地会陷入疯狂,并要求您的应用程序做除了煮咖啡以外的所有事情(毕竟,这就是实习生的工作!)。 =18=]
您可能想研究使用 Hangfire。它可以让您安排任务,并为您提供一个漂亮的仪表板来管理任务。您可以在 NuGet 中找到它,并且 Hangfire 站点上的文档非常好。
它非常易于使用,这里是一个示例,说明如果您想每分钟 运行 一个作业,您必须添加到 OWIN 启动程序 class 中:
public void Configuration(IAppBuilder app)
{
app.UseHangfire(config =>
{
config.UseSqlServerStorage("connection string");
config.UseServer();
});
InitializeJobs();
}
public static void InitializeJobs()
{
RecurringJob.AddOrUpdate("jobName", () => CallToJobFunction(), Cron.Minutely);
}
查看 hanselman 的博客,他在其中讨论了这个主题: http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx