在HangFire中,我可以使用队列名称而不是使用队列属性进行排队吗?

SFu*_*n28 8 hangfire

文档说明您可以通过使用Queue要调用的方法的属性来指定队列.这假设您始终希望在同一队列上执行方法.是否有一种方法可以调用进程Enqueue来指定要将作业放入队列的名称(有效地将决策权交给作业生成器,而不是作业的定义).

Xav*_*ero 12

使用IBackgroundJobClient的实例,您可以指定队列.

IBackgroundJobClient hangFireClient = new BackgroundJobClient();
EnqueuedState myQueueState = new Hangfire.States.EnqueuedState("myQueue");
hangFireClient.Create<SomeClass>(c => c.SomeMethod(), myQueueState);
Run Code Online (Sandbox Code Playgroud)

请注意,通过这种方式,重试会将作业恢复到默认队列.您需要使用JobFilter在同一队列中重试其他代码

http://discuss.hangfire.io/t/one-queue-for-the-whole-farm-and-one-queue-by-server/490/3


Raj*_*iya 6

如果您想动态更改队列,可以按照这种方式。

此实施适用于所有人EnqueueSchedule并且ContinueJobWith

诡计发生在[Queue("{0}")]. Hangfire 将作业参数传递给给定的pattern( "{0}"),用于获取每次状态更改String.Format("{0}", job.Args)时的实际队列,因此即使重试也会应用目标队列。

突出显示的代码语法:

// Enqueue "MyBackgroundJob1" under "critical" queue
var job2 = BackgroundJob.Enqueue(() => MyBackgroundJob1("critical", 523));

// Use one of following Attributes depending on your hangfire version
//[AdvancedQueue("{0}")] //  1.6.X 
[Queue("{0}")] // In 1.7.X
public void MyBackgroundJob1(string queueName, int arg)
{
    // Job implementation
}
Run Code Online (Sandbox Code Playgroud)

全面实施:

public class HangfireDynamicQueue
{
    public void EnqueJobs()
    {
        // Enqueue "MyBackgroundJob1" under "default" queue
        var job1 = BackgroundJob.Enqueue(() => MyBackgroundJob1("default", 123));

        // Enqueue "MyBackgroundJob1" under "critical" queue
        var job2 = BackgroundJob.Enqueue(() => MyBackgroundJob1("critical", 523));

        // Execute "MyBackgroundJob1" after 10 seconds under "delayed" queue
        var job3 = BackgroundJob.Schedule(() => MyBackgroundJob1("delayed", 678), TimeSpan.FromSeconds(10));

        // Run "MyBackgroundJob2" after job3 under "delayed" queue
        var job4 = BackgroundJob.ContinueJobWith(job3, () => MyBackgroundJob2("delayed", 435));
    }

    // Use one of following Attributes depending on your hangfire version
    //[AdvancedQueue("{0}")] //  1.6.X 
    [Queue("{0}")] // In 1.7.X
    public void MyBackgroundJob1(string queueName, int arg)
    {
        // Job implementation
    }

    // Use one of following Attributes depending on your hangfire version
    //[AdvancedQueue("{0}")] //  1.6.X 
    [Queue("{0}")] // In 1.7.X
    public void MyBackgroundJob2(string queueName, int arg)
    {
        // Job implementation
    }
}
Run Code Online (Sandbox Code Playgroud)