跳至页脚内容
.NET 帮助

Quartz .NET(开发人员如何使用)

Quartz.NET 介绍

对于 .NET 应用程序,Quartz.NET 是一个备受欢迎的开源任务调度工具包。 它为程序员提供了一个强大的基础,用于在预定时间、间隔或响应触发器的情况下计划和执行作业、日程安排或流程。 Quartz.NET 使得在 .NET 应用程序中构建复杂的调度场景变得更加容易,无论是用于发送通知、安排作业、生成报告还是完成定期维护活动。 Quartz.NET 作为一个作业调度系统,适合从创建小型应用程序到大规模企业系统。

Quartz.NET 的最新调度器版本与各种支持的数据库提供者无缝集成,赋予开发人员使用便捷的扩展方法来扩展其功能,同时确保作为托管服务可靠地执行任务。

将 Quartz.NET 与 IronPDF 集成,可以在 .NET 应用程序中构建具有强大 PDF 生成能力的可靠调度系统。 尽管 IronPDF 提供了用于创建、修改和显示 PDF 文档的完整工具套件,Quartz.NET 则提供了多功能且可靠的调度系统。 结合使用时,它们使开发人员能够将 PDF 生成操作自动化,作为工作流程的一部分或安排后台作业,从而提高应用程序的实用性和功能性。

关键特性

灵活的调度

Quartz.NET 使程序员能够创建日程,指示程序在预定的间隔或时间运行(例如,按小时、每日、每 30 分钟)。 它兼容复杂的调度模式,例如 cron 表达式,这提供了对代码、作业和服务执行时间的精确控制。

基于触发器的执行

在 Quartz.NET 中,作业可以通过多种触发器启动。 这些包括基于日历的触发器(例如,排除周末),简单触发器(根据设定的时间表运行),作业触发器,以及依赖于外部情况或事件的自定义触发器。

作业持久化

Quartz.NET 具有以持久化方式安排作业的能力,支持在数据库中存储计划任务及其完成的历史记录。 作业计划对应用程序故障或重启具有弹性,并且支持高可用性和可伸缩性。

并发控制

为了确保任务的安全和有效完成,Quartz.NET 拥有内置的并发控制工具。 为了控制作业执行的并发性,开发人员可以设置线程池、作业优先级和执行约束。

作业链和依赖管理

开发人员可以利用 Quartz.NET 的作业链和依赖管理功能,定义作业的执行顺序及其关系。 这使得为后台作业、服务和程序创建复杂的编排场景成为可能。

错误处理和重试技术

为了优雅地管理失败,Quartz.NET 配备了错误处理和重试技术。 在临时失败或异常发生的情况下,开发人员可以设置重试策略和错误处理技术,以确保作业被重试或重新安排。

集群与可伸缩性

得益于 Quartz.NET 对分布式作业调度中的集群支持,调度程序的多个实例可以在服务器集群中协调并执行任务。 这通过启用横向可伸缩性和容错能力,确保了在分布式环境中可靠的作业调度器和执行。

与 .NET 生态系统集成

Quartz.NET 轻松接口 .NET 生态系统,包括消息传递系统(如 Rebus.NET、MassTransit),日志框架(如 Serilog、NLog),以及流行的依赖注入框架(如 Autofac、Microsoft.Extensions.DependencyInjection)。

创建和配置 Quartz.NET

定义作业和触发器

为您希望执行的任务建立作业和触发器。 要完成的任务由上下文对象和作业类表示,作业执行的频率和时间由触发器决定。

using Quartz;

// Define a job by implementing the IJob interface
public class MyJob : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {
        // Implement the logic for your job here
    }
}

// Build the job instance using JobBuilder
var job = JobBuilder.Create<MyJob>()
    .WithIdentity("myJob", "group1") // Assign a unique name and group to the job
    .Build();

// Create a trigger to define when the job should be executed
var trigger = TriggerBuilder.Create()
    .WithIdentity("myTrigger", "group1") // Assign a unique name and group to the trigger
    .WithCronSchedule("0 0/5 * * * ?") // Run every 5 minutes based on the cron expression
    .Build();
using Quartz;

// Define a job by implementing the IJob interface
public class MyJob : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {
        // Implement the logic for your job here
    }
}

// Build the job instance using JobBuilder
var job = JobBuilder.Create<MyJob>()
    .WithIdentity("myJob", "group1") // Assign a unique name and group to the job
    .Build();

// Create a trigger to define when the job should be executed
var trigger = TriggerBuilder.Create()
    .WithIdentity("myTrigger", "group1") // Assign a unique name and group to the trigger
    .WithCronSchedule("0 0/5 * * * ?") // Run every 5 minutes based on the cron expression
    .Build();
Imports Quartz

' Define a job by implementing the IJob interface
Public Class MyJob
	Implements IJob

	Public Async Function Execute(ByVal context As IJobExecutionContext) As Task
		' Implement the logic for your job here
	End Function
End Class

' Build the job instance using JobBuilder
Private job = JobBuilder.Create(Of MyJob)().WithIdentity("myJob", "group1").Build()

' Create a trigger to define when the job should be executed
Private trigger = TriggerBuilder.Create().WithIdentity("myTrigger", "group1").WithCronSchedule("0 0/5 * * * ?").Build()
$vbLabelText   $csharpLabel

配置和初始化调度器

在使用指定配置设置作业调度器以调度后台任务、作业和触发器后,启动调度器开始规划和执行作业。

using Quartz;
using Quartz.Impl;

// Create a scheduler factory and get a scheduler instance
var schedulerFactory = new StdSchedulerFactory();
var scheduler = await schedulerFactory.GetScheduler(); 

// Start the scheduler
await scheduler.Start();

// Schedule the job with its corresponding trigger
await scheduler.ScheduleJob(job, trigger);
using Quartz;
using Quartz.Impl;

// Create a scheduler factory and get a scheduler instance
var schedulerFactory = new StdSchedulerFactory();
var scheduler = await schedulerFactory.GetScheduler(); 

// Start the scheduler
await scheduler.Start();

// Schedule the job with its corresponding trigger
await scheduler.ScheduleJob(job, trigger);
Imports Quartz
Imports Quartz.Impl

' Create a scheduler factory and get a scheduler instance
Private schedulerFactory = New StdSchedulerFactory()
Private scheduler = await schedulerFactory.GetScheduler()

' Start the scheduler
Await scheduler.Start()

' Schedule the job with its corresponding trigger
Await scheduler.ScheduleJob(job, trigger)
$vbLabelText   $csharpLabel

作业持久化

设置 Quartz.NET 在持久存储(如数据库)中存储作业和触发器元数据。 这保证了可靠性,并允许作业生存应用程序重启。

错误处理

将错误处理和重试逻辑整合到您的工作执行逻辑中,以优雅地处理失败。 Quartz.NET 提供了内置的方法来管理异常和重试任务。

集群

为了确保在分布式环境中使用 Quartz.NET 时的高可用性和可伸缩性,请设置集群。 通过集群,调度程序实例可以在服务器集群之间协作并执行任务。

依赖注入

如果您的应用程序使用依赖注入框架,请设置 Quartz.NET 与您的依赖注入(DI)容器通信,以管理作业依赖、配置和生命周期。

IronPDF。

Quartz .NET(对开发人员的工作原理):图 1 - IronPDF 网页

.NET 包 IronPDF 使得在 .NET 程序中创建、修改和渲染 PDF 文档成为可能。 提供了丰富的功能来与 PDF 互动:从 HTML 内容、照片或原始数据创建 PDF 文档; 向现有的 PDF 文档附加文本、图像和形状; 将 HTML 页面转换为 PDF; 从 PDF 中提取文本和图像。

IronPDF在HTML到PDF转换方面表现出色,确保精确保留原始布局和样式。 它非常适合从基于Web的内容中创建PDF,如报告、发票和文档。 利用对HTML文件、URL和原始HTML字符串的支持,IronPDF轻松生成高质量的PDF文档。

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert an HTML string to a PDF document
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert an HTML file to a PDF document
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert a URL to a PDF document
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert an HTML string to a PDF document
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert an HTML file to a PDF document
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert a URL to a PDF document
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
Imports IronPdf

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim renderer = New ChromePdfRenderer()

		' 1. Convert an HTML string to a PDF document
		Dim htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>"
		Dim pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent)
		pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf")

		' 2. Convert an HTML file to a PDF document
		Dim htmlFilePath = "path_to_your_html_file.html" ' Specify the path to your HTML file
		Dim pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath)
		pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf")

		' 3. Convert a URL to a PDF document
		Dim url = "http://ironpdf.com" ' Specify the URL
		Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
		pdfFromUrl.SaveAs("URLToPDF.pdf")
	End Sub
End Class
$vbLabelText   $csharpLabel

IronPDF 的简便性和用户友好性是其主要优势之一。 借助其用户友好的 API 和广泛的文档,开发人员可以在 .NET 项目中轻松开始生成 PDF。 IronPDF 的速度和效率也是使开发人员能够快速且高效生产高质量 PDF 文档的特点。

IronPDF。 Core Features

  • 从原始数据、HTML 和图像创建 PDF。
  • 从 PDF 文件中提取文本和图像。
  • 允许您在 PDF 文件中包含标题、脚注和水印。
  • 创建具有密码和加密安全性的 PDF 文档。
  • 提供填写表单和数字签名的工具。

使用 Quartz 与 IronPDF

要在控制台或 ASP.NET Core 应用程序中开始使用 IronPDF 和 Quartz.NET,您可以使用 IronPDF 建立一个计划的后台作业,运行与 PDF 生产相关的任务。

安装 Quartz 和 IronPDF 包

首先,确保您已在 .NET 项目中通过 Visual Studio 包管理器控制台安装 IronPDF 和 Quartz.NET 所需的 NuGet 包,使用以下命令:

Install-Package Quartz
Install-Package IronPdf
Install-Package Quartz
Install-Package IronPdf
SHELL

代码示例

本节演示了如何制作一个使用 IronPDF 创建 PDF 文档的 Quartz 作业。

using Quartz;
using IronPdf;

// Implementing a job that generates a PDF using IronPDF
public class PdfGenerationJob : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {
        // Generating PDF using IronPDF
        var htmlContent = "<h1>Hello, IronPDF!</h1>";
        var pdfRenderer = new HtmlToPdf();
        var pdfDocument = pdfRenderer.RenderHtmlAsPdf(htmlContent);

        // Save the generated PDF to a file
        pdfDocument.SaveAs("output.pdf");
    }
}
using Quartz;
using IronPdf;

// Implementing a job that generates a PDF using IronPDF
public class PdfGenerationJob : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {
        // Generating PDF using IronPDF
        var htmlContent = "<h1>Hello, IronPDF!</h1>";
        var pdfRenderer = new HtmlToPdf();
        var pdfDocument = pdfRenderer.RenderHtmlAsPdf(htmlContent);

        // Save the generated PDF to a file
        pdfDocument.SaveAs("output.pdf");
    }
}
Imports Quartz
Imports IronPdf

' Implementing a job that generates a PDF using IronPDF
Public Class PdfGenerationJob
	Implements IJob

	Public Async Function Execute(ByVal context As IJobExecutionContext) As Task
		' Generating PDF using IronPDF
		Dim htmlContent = "<h1>Hello, IronPDF!</h1>"
		Dim pdfRenderer = New HtmlToPdf()
		Dim pdfDocument = pdfRenderer.RenderHtmlAsPdf(htmlContent)

		' Save the generated PDF to a file
		pdfDocument.SaveAs("output.pdf")
	End Function
End Class
$vbLabelText   $csharpLabel

设置 Quartz.NET 以利用触发器在预定计划上运行 PDF 创建过程。

// Create and configure the Quartz scheduler
var schedulerFactory = new StdSchedulerFactory();
var scheduler = await schedulerFactory.GetScheduler();
await scheduler.Start();

// Define the job and bind it to our PdfGenerationJob class
var job = JobBuilder.Create<PdfGenerationJob>()
    .WithIdentity("pdfGenerationJob", "pdfGenerationGroup")
    .Build();

// Define a trigger to schedule the PDF generation job
var trigger = TriggerBuilder.Create()
    .WithIdentity("pdfGenerationTrigger", "pdfGenerationGroup")
    .WithSimpleSchedule(x => x
        .WithIntervalInMinutes(30) // Run every 30 minutes
        .RepeatForever())
    .Build();

// Schedule the job using the scheduler
await scheduler.ScheduleJob(job, trigger);
// Create and configure the Quartz scheduler
var schedulerFactory = new StdSchedulerFactory();
var scheduler = await schedulerFactory.GetScheduler();
await scheduler.Start();

// Define the job and bind it to our PdfGenerationJob class
var job = JobBuilder.Create<PdfGenerationJob>()
    .WithIdentity("pdfGenerationJob", "pdfGenerationGroup")
    .Build();

// Define a trigger to schedule the PDF generation job
var trigger = TriggerBuilder.Create()
    .WithIdentity("pdfGenerationTrigger", "pdfGenerationGroup")
    .WithSimpleSchedule(x => x
        .WithIntervalInMinutes(30) // Run every 30 minutes
        .RepeatForever())
    .Build();

// Schedule the job using the scheduler
await scheduler.ScheduleJob(job, trigger);
' Create and configure the Quartz scheduler
Dim schedulerFactory = New StdSchedulerFactory()
Dim scheduler = Await schedulerFactory.GetScheduler()
Await scheduler.Start()

' Define the job and bind it to our PdfGenerationJob class
Dim job = JobBuilder.Create(Of PdfGenerationJob)().WithIdentity("pdfGenerationJob", "pdfGenerationGroup").Build()

' Define a trigger to schedule the PDF generation job
Dim trigger = TriggerBuilder.Create().WithIdentity("pdfGenerationTrigger", "pdfGenerationGroup").WithSimpleSchedule(Function(x) x.WithIntervalInMinutes(30).RepeatForever()).Build()

' Schedule the job using the scheduler
Await scheduler.ScheduleJob(job, trigger)
$vbLabelText   $csharpLabel

要启动 Quartz 调度器并开始执行计划任务:

// Start the scheduler
await scheduler.Start();
// Optionally, monitor scheduler for job execution
// Start the scheduler
await scheduler.Start();
// Optionally, monitor scheduler for job execution
' Start the scheduler
Await scheduler.Start()
' Optionally, monitor scheduler for job execution
$vbLabelText   $csharpLabel

下面是从上述代码生成的输出。

Quartz .NET(对开发人员的工作原理):图 2 - IronPDF 和 Quartz.NET 代码示例的输出

结论

总而言之,Quartz.NET 和 IronPDF 的组合为自动化 .NET 应用程序中创建 PDF 的操作提供了一种强大的方法。 借助 Quartz.NET 的强大而灵活的调度系统,开发人员可以创建将会在预定的间隔或时段执行活动的作业和触发器。 另一方面,IronPDF 为开发人员提供了所有所需工具来创建和处理 PDF 文档。 使用 HTML、图形或原始数据,开发人员可以创建具有专业外观的 PDF。

通过将 IronPDF 的 PDF 生成功能与 Quartz.NET 的调度能力集成在一起,开发人员可以自动化分布式应用程序中的常见 PDF 生成操作,例如在预定的间隔或响应触发器时生成报告、发票,或文档。 这种集成使开发人员更容易地生产和发送高质量的 PDF 文档给客户或客户朋友,通过简化文档生成工作流程,提高生产力,减少手动工作。

IronPDF 价格合理,当作为包的一部分购买时,还附带终身许可证。 由于包的价格仅为 $799,这是针对多个系统的一次性费用,因此物超所值。 它为许可证持有者提供全天候在线工程支持。 要了解有关 Iron Software 制造的产品的更多信息,请访问 Iron Software 网站的 Iron Software 产品页面。

常见问题解答

如何在.NET应用程序中自动生成PDF?

您可以通过将Quartz.NET与IronPDF集成来自动化PDF创建。Quartz.NET处理调度任务,而IronPDF允许您从HTML、图像或原始数据生成PDF。

使用Quartz.NET进行任务调度有什么好处?

Quartz.NET提供了一个强大的调度任务框架,具有灵活的调度、基于触发器的执行、任务持久性、并发控制、任务链、错误处理、重试技术以及集群以实现可扩展性等功能。

IronPDF如何简化.NET中的PDF生成?

IronPDF通过提供一个用户友好的API将HTML、图像或原始数据转换为PDF文档,简化了PDF生成,是生成报告、发票和文档的理想选择。它保持了原始布局和风格,确保高质量输出。

Quartz.NET和PDF工具可以集成以增强工作流程自动化吗?

是的,将Quartz.NET与IronPDF等PDF工具集成可以通过在.NET应用程序内调度和自动化PDF生成任务来增强工作流程自动化,提高效率和生产力。

什么是Quartz.NET中的任务持久性,为什么重要?

Quartz.NET中的任务持久性是指能够将计划的任务及其历史记录存储在数据库中,确保在应用程序失败或重启时的弹性。这对于维护任务调度和实现任务集群至关重要。

如何在.NET应用程序中将HTML转换为PDF?

您可以使用IronPDF的RenderHtmlAsPdf方法将HTML字符串转换为PDF,或使用RenderHtmlFileAsPdf将HTML文件直接转换为PDF。

Quartz.NET支持哪种类型的调度模式?

Quartz.NET支持多种调度模式,包括cron表达式,提供对执行时间的精确控制并支持复杂的调度场景。

如何在我的.NET项目中安装Quartz.NET和IronPDF?

使用Visual Studio包管理器控制台的命令Install-Package QuartzInstall-Package IronPdf安装Quartz.NET和IronPDF。

IronPDF在PDF操作中有哪些核心功能?

IronPDF提供了从HTML、图像或原始数据创建PDF、提取文本和图像、添加页眉、页脚和水印,以及密码保护等安全选项等功能。

Quartz.NET和IronPDF的集成如何增强.NET应用程序?

将Quartz.NET与IronPDF集成允许自动化PDF生成和任务调度,简化工作流程,提升.NET应用程序的生产力。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。