Hangfire:直接将作业添加到数据库

Hangfire: Add job directly to DB

我正在使用 Hangfire 进行后台处理。 Hangfire 服务器是 运行 作为网络应用程序,我希望能够从 SSIS 包中将作业直接排入数据库 - 这是 supported/possible 吗?

更好的方法 - 编写一个 Web API 并从您的 SSIS 包中调用它。在 API 中写入启动 Hangfire 作业的步骤。

您可以尝试做的一个 hack 是 - 当您从 .Net 代码中排队作业并尝试从 SQL 查询中模仿时,观察插入到 Hangfire 数据库表中的记录。不过我从来没有尝试过。祝你好运!

如果您出于某种原因真的想通过数据库添加作业,您可以尝试执行此 SQL 查询。一段时间后(在 Hangfire 服务器中配置的 QueuePollInterval)Hangfire 将 运行 这个排队的作业

但请记住,这是一个“hack”,将来可能会更改 Hangfire 表。因此,如果可以,请使用其他方法

BEGIN TRANSACTION

SET XACT_ABORT ON

DECLARE @queue VARCHAR(20) = 'default'

DECLARE @culture VARCHAR(20) = '"en-US"'

DECLARE @uiCulture VARCHAR(20) = '"en-US"'

-- You can InvocationData and Arguments from some completed job in DB

DECLARE @invocationData VARCHAR(MAX) = '{"t":"YourAppNamespace.JobClass, YourAppAssembly","m":"JobName"}'

DECLARE @arguments VARCHAR(MAX) = '[]'

DECLARE @currentTime DATETIME = GETUTCDATE()

IF (SELECT Version FROM HangFire.[Schema]) <> 7
BEGIN
    PRINT 'Invalid HangFire schema, please review the script'
    SET NOEXEC ON
END

DECLARE @jobId TABLE (ID INT)

INSERT INTO HangFire.Job
(
    StateId,
    StateName,
    InvocationData,
    Arguments,
    CreatedAt,
    ExpireAt
)
OUTPUT inserted.Id INTO @jobId
VALUES
(
    NULL,
    'Enqueued',
    @invocationData,
    @arguments,
    @currentTime,
    NULL
)

DECLARE @unixTimeSeconds VARCHAR(20) = CAST(DATEDIFF(SECOND, {d '1970-01-01'}, GETUTCDATE()) AS VARCHAR(20))

DECLARE @stateId TABLE (ID INT)

INSERT INTO HangFire.State
(
    JobId,
    Name,
    Reason,
    CreatedAt,
    Data
)
OUTPUT inserted.Id INTO @stateId
VALUES
(
    (SELECT Id FROM @jobId),
    'Enqueued',
    'Added via SQL script',
    @currentTime,
    CONCAT('{"EnqueuedAt":"', @unixTimeSeconds, '000","Queue":"', @queue, '"}')
)

UPDATE HangFire.Job
SET StateId = (SELECT Id FROM @stateId)
WHERE Id = (SELECT Id FROM @jobId)

INSERT INTO HangFire.JobParameter
(
    JobId,
    Name,
    Value
)
VALUES
(
    (SELECT Id FROM @jobId),
    'CurrentCulture',
    @culture
),
(
    (SELECT Id FROM @jobId),
    'CurrentUICulture',
    @uiCulture
),
(
    (SELECT Id FROM @jobId),
    'Time',
    @unixTimeSeconds
)

INSERT INTO HangFire.JobQueue
(
    JobId,
    Queue
)
VALUES
(
    (SELECT Id FROM @jobId),
    @queue
)

SET NOEXEC OFF

COMMIT