从服务获取当前Quartz.NET IJobExecutionContext FireInstanceId

问题描述 投票:0回答:1

我有一个 Quartz.NET 作业的作业定义:

public class ProcessMessageJob : IJob
{
    private readonly ILogger<ProcessMessageJob> _logger;
    private readonly TransferMessageService _transferMessageService;

    public ProcessMessageJob(ILogger<ProcessMessageJob> logger, TransferMessageService transferMessageService)
    {
        _logger = logger;
        _transferMessageService = transferMessageService;
    }

    public async Task Execute(IJobExecutionContext context)
    {
        await _transferMessageService.ProcessTransferMessages();
    }
}

我希望在我的服务中使用 Quartz.NET 作业中的

context.FireInstanceId
来添加日志记录(无需将 fireinstanceId 添加为每个方法调用的参数):

   public async Task ProcessTransferMessages()
    {
        var fireInstanceId = magicSpell.getCurrentQuartzFireInstanceId();
        _logger.LogInformation("FireinstanceId: {fireInstanceId}", fireInstanceId);
    }

有什么东西可以直接从 Quartz.NET 获得吗?或者我可以使用依赖注入来解决这个问题吗?在我的工作中创建新范围时?

   public async Task Execute(IJobExecutionContext context)
    {
        var scope = _services.CreateScope();
        var tms = scope.ServiceProvider.GetRequiredService<TransferMessageService>(); //add FireInstanceId here somehow??
        await tms.ProcessTransferMessages();
    }
c# dependency-injection quartz.net
1个回答
0
投票
  1. 使用
    LogContext.PushProperty
    在作业开始时使用
    FireInstanceId
    设置 Serilog 属性
    Execute(IJobExecutionContext)
  2. 使用水槽中的财产
    outputTemplate

就是这样。现在,甚至会从您的作业依赖项中记录

FireInstanceId

示例

using Serilog.Context;

class MyJob : IJob
{
    public async Task Execute(IJobExecutionContext jobContext)
    {
        using var _ = LogContext.PushProperty("JobFireInstanceId", jobContext.FireInstanceId);

        // Job logic...
    }
}
outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss} {Level} {JobFireInstanceId}] {Message}{NewLine}"
已登录记录
[2023-11-13 17:02:05 Debug 638354729585261760] My log message

检查我的业余项目中的更改

QuartzSerilogPlayground

改进

现在,当您开始工作时,您可能需要考虑一些改进。也许您不想将这样的说明复制并粘贴到您的每一项工作中。也许您不想在所有作业中重复属性名称。也许您想在全局范围内配置一次行为,并且根本不更改作业。

我考虑了具有行为的基本工作类别,但最终我在

IJobExecutionContext
上保留了简单的扩展方法,所以我的工作从:

开始
public async Task Execute(IJobExecutionContext jobContext)
{
    using var _ = jobContext.PushSerilogPropertyJobFireInstanceId();

我尝试过全局方法,但没有成功。我想使用作业侦听器为所有作业声明一次。

© www.soinside.com 2019 - 2024. All rights reserved.