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
我正在使用 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