mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2026-02-09 09:16:41 +08:00
Updated usages of ITaskLeaseService with IDistributedLockService.
This commit is contained in:
@@ -7,8 +7,8 @@ using Orchard.Environment.Extensions;
|
|||||||
using Orchard.Logging;
|
using Orchard.Logging;
|
||||||
using Orchard.Services;
|
using Orchard.Services;
|
||||||
using Orchard.Settings;
|
using Orchard.Settings;
|
||||||
using Orchard.TaskLease.Services;
|
|
||||||
using Orchard.Tasks;
|
using Orchard.Tasks;
|
||||||
|
using Orchard.Tasks.Locking.Services;
|
||||||
|
|
||||||
namespace Orchard.AuditTrail.Services {
|
namespace Orchard.AuditTrail.Services {
|
||||||
[OrchardFeature("Orchard.AuditTrail.Trimming")]
|
[OrchardFeature("Orchard.AuditTrail.Trimming")]
|
||||||
@@ -16,19 +16,19 @@ namespace Orchard.AuditTrail.Services {
|
|||||||
private static readonly object _sweepLock = new object();
|
private static readonly object _sweepLock = new object();
|
||||||
private readonly ISiteService _siteService;
|
private readonly ISiteService _siteService;
|
||||||
private readonly IClock _clock;
|
private readonly IClock _clock;
|
||||||
private readonly ITaskLeaseService _taskLeaseService;
|
|
||||||
private readonly IAuditTrailManager _auditTrailManager;
|
private readonly IAuditTrailManager _auditTrailManager;
|
||||||
|
private readonly IDistributedLockService _distributedLockService;
|
||||||
|
|
||||||
public AuditTrailTrimmingBackgroundTask(
|
public AuditTrailTrimmingBackgroundTask(
|
||||||
ISiteService siteService,
|
ISiteService siteService,
|
||||||
IClock clock,
|
IClock clock,
|
||||||
ITaskLeaseService taskLeaseService,
|
IAuditTrailManager auditTrailManager,
|
||||||
IAuditTrailManager auditTrailManager) {
|
IDistributedLockService distributedLockService) {
|
||||||
|
|
||||||
_siteService = siteService;
|
_siteService = siteService;
|
||||||
_clock = clock;
|
_clock = clock;
|
||||||
_taskLeaseService = taskLeaseService;
|
|
||||||
_auditTrailManager = auditTrailManager;
|
_auditTrailManager = auditTrailManager;
|
||||||
|
_distributedLockService = distributedLockService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AuditTrailTrimmingSettingsPart Settings {
|
public AuditTrailTrimmingSettingsPart Settings {
|
||||||
@@ -41,17 +41,20 @@ namespace Orchard.AuditTrail.Services {
|
|||||||
Logger.Debug("Beginning sweep.");
|
Logger.Debug("Beginning sweep.");
|
||||||
|
|
||||||
// Only allow this task to run on one farm node at a time.
|
// Only allow this task to run on one farm node at a time.
|
||||||
if (_taskLeaseService.Acquire(GetType().FullName, _clock.UtcNow.AddHours(1)) != null) {
|
DistributedLock @lock;
|
||||||
|
if (_distributedLockService.TryAcquireLockForMachine(GetType().FullName, TimeSpan.FromHours(1), out @lock)) {
|
||||||
|
using (@lock) {
|
||||||
|
|
||||||
// We don't need to check the audit trail for events to remove every minute. Let's stick with twice a day.
|
// We don't need to check the audit trail for events to remove every minute. Let's stick with twice a day.
|
||||||
if (!GetIsTimeToTrim())
|
if (!GetIsTimeToTrim())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Logger.Debug("Starting audit trail trimming.");
|
Logger.Debug("Starting audit trail trimming.");
|
||||||
var deletedRecords = _auditTrailManager.Trim(TimeSpan.FromDays(Settings.RetentionPeriod));
|
var deletedRecords = _auditTrailManager.Trim(TimeSpan.FromDays(Settings.RetentionPeriod));
|
||||||
Logger.Debug("Audit trail trimming completed. {0} records were deleted.", deletedRecords.Count());
|
Logger.Debug("Audit trail trimming completed. {0} records were deleted.", deletedRecords.Count());
|
||||||
Settings.LastRunUtc = _clock.UtcNow;
|
Settings.LastRunUtc = _clock.UtcNow;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex) {
|
catch (Exception ex) {
|
||||||
Logger.Error(ex, "Error during sweep.");
|
Logger.Error(ex, "Error during sweep.");
|
||||||
|
|||||||
@@ -3,19 +3,17 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
using Microsoft.WindowsAzure.MediaServices.Client;
|
||||||
using Orchard.Azure.MediaServices.Helpers;
|
using Orchard.Azure.MediaServices.Helpers;
|
||||||
using Orchard.Azure.MediaServices.Models;
|
using Orchard.Azure.MediaServices.Models;
|
||||||
using Orchard.Azure.MediaServices.Models.Assets;
|
using Orchard.Azure.MediaServices.Models.Assets;
|
||||||
using Orchard.Azure.MediaServices.Models.Jobs;
|
using Orchard.Azure.MediaServices.Models.Jobs;
|
||||||
using Orchard.Azure.MediaServices.Services.Assets;
|
using Orchard.Azure.MediaServices.Services.Assets;
|
||||||
using Orchard.Azure.MediaServices.Services.Wams;
|
using Orchard.Azure.MediaServices.Services.Wams;
|
||||||
using Microsoft.WindowsAzure.MediaServices.Client;
|
|
||||||
using Orchard;
|
|
||||||
using Orchard.ContentManagement;
|
using Orchard.ContentManagement;
|
||||||
using Orchard.Logging;
|
using Orchard.Logging;
|
||||||
using Orchard.Services;
|
|
||||||
using Orchard.TaskLease.Services;
|
|
||||||
using Orchard.Tasks;
|
using Orchard.Tasks;
|
||||||
|
using Orchard.Tasks.Locking.Services;
|
||||||
|
|
||||||
namespace Orchard.Azure.MediaServices.Services.Jobs {
|
namespace Orchard.Azure.MediaServices.Services.Jobs {
|
||||||
public class JobProcessor : Component, IBackgroundTask {
|
public class JobProcessor : Component, IBackgroundTask {
|
||||||
@@ -23,26 +21,23 @@ namespace Orchard.Azure.MediaServices.Services.Jobs {
|
|||||||
private static readonly object _sweepLock = new object();
|
private static readonly object _sweepLock = new object();
|
||||||
|
|
||||||
private readonly IWamsClient _wamsClient;
|
private readonly IWamsClient _wamsClient;
|
||||||
private readonly IClock _clock;
|
|
||||||
private readonly ITaskLeaseService _taskLeaseService;
|
|
||||||
private readonly IAssetManager _assetManager;
|
private readonly IAssetManager _assetManager;
|
||||||
private readonly IJobManager _jobManager;
|
private readonly IJobManager _jobManager;
|
||||||
private readonly IOrchardServices _orchardServices;
|
private readonly IOrchardServices _orchardServices;
|
||||||
|
private readonly IDistributedLockService _distributedLockService;
|
||||||
|
|
||||||
public JobProcessor(
|
public JobProcessor(
|
||||||
IWamsClient wamsClient,
|
IWamsClient wamsClient,
|
||||||
IClock clock,
|
|
||||||
ITaskLeaseService taskLeaseService,
|
|
||||||
IAssetManager assetManager,
|
IAssetManager assetManager,
|
||||||
IJobManager jobManager,
|
IJobManager jobManager,
|
||||||
IOrchardServices orchardServices) {
|
IOrchardServices orchardServices,
|
||||||
|
IDistributedLockService distributedLockService) {
|
||||||
|
|
||||||
_wamsClient = wamsClient;
|
_wamsClient = wamsClient;
|
||||||
_clock = clock;
|
|
||||||
_taskLeaseService = taskLeaseService;
|
|
||||||
_assetManager = assetManager;
|
_assetManager = assetManager;
|
||||||
_jobManager = jobManager;
|
_jobManager = jobManager;
|
||||||
_orchardServices = orchardServices;
|
_orchardServices = orchardServices;
|
||||||
|
_distributedLockService = distributedLockService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Sweep() {
|
public void Sweep() {
|
||||||
@@ -56,103 +51,106 @@ namespace Orchard.Azure.MediaServices.Services.Jobs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Only allow this task to run on one farm node at a time.
|
// Only allow this task to run on one farm node at a time.
|
||||||
if (_taskLeaseService.Acquire(GetType().FullName, _clock.UtcNow.AddHours(1)) != null) {
|
DistributedLock @lock;
|
||||||
var jobs = _jobManager.GetActiveJobs().ToDictionary(job => job.WamsJobId);
|
if (_distributedLockService.TryAcquireLockForMachine(GetType().FullName, TimeSpan.FromHours(1), out @lock)) {
|
||||||
|
using (@lock) {
|
||||||
|
var jobs = _jobManager.GetActiveJobs().ToDictionary(job => job.WamsJobId);
|
||||||
|
|
||||||
if (!jobs.Any()) {
|
if (!jobs.Any()) {
|
||||||
Logger.Debug("No open jobs were found; going back to sleep.");
|
Logger.Debug("No open jobs were found; going back to sleep.");
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
Logger.Information("Beginning processing of {0} open jobs.", jobs.Count());
|
|
||||||
|
|
||||||
var wamsJobs = _wamsClient.GetJobsById(jobs.Keys);
|
|
||||||
|
|
||||||
foreach (var wamsJob in wamsJobs) {
|
|
||||||
Logger.Information("Processing job '{0}'...", wamsJob.Name);
|
|
||||||
|
|
||||||
var job = jobs[wamsJob.Id];
|
|
||||||
var tasks = job.Tasks.ToDictionary(task => task.WamsTaskId);
|
|
||||||
var wamsTasks = wamsJob.Tasks.ToArray();
|
|
||||||
|
|
||||||
foreach (var wamsTask in wamsTasks) {
|
|
||||||
var task = tasks[wamsTask.Id];
|
|
||||||
task.Status = MapWamsJobState(wamsTask.State);
|
|
||||||
task.PercentComplete = (int)wamsTask.Progress;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var previousStatus = job.Status;
|
Logger.Information("Beginning processing of {0} open jobs.", jobs.Count());
|
||||||
var wamsJobErrors = HarvestWamsJobErrors(wamsJob).ToArray();
|
|
||||||
|
|
||||||
job.CreatedUtc = wamsJob.Created;
|
var wamsJobs = _wamsClient.GetJobsById(jobs.Keys);
|
||||||
job.StartedUtc = wamsJob.StartTime;
|
|
||||||
job.FinishedUtc = wamsJob.EndTime;
|
|
||||||
job.Status = MapWamsJobState(wamsJob.State);
|
|
||||||
job.ErrorMessage = GetAggregateErrorMessage(wamsJobErrors);
|
|
||||||
|
|
||||||
LogWamsJobErrors(wamsJobErrors);
|
foreach (var wamsJob in wamsJobs) {
|
||||||
|
Logger.Information("Processing job '{0}'...", wamsJob.Name);
|
||||||
|
|
||||||
if (job.Status != previousStatus) {
|
var job = jobs[wamsJob.Id];
|
||||||
if (job.Status == JobStatus.Finished) {
|
var tasks = job.Tasks.ToDictionary(task => task.WamsTaskId);
|
||||||
Logger.Information("Job '{0}' was finished in WAMS; creating locators.", wamsJob.Name);
|
var wamsTasks = wamsJob.Tasks.ToArray();
|
||||||
|
|
||||||
var lastTask = job.Tasks.Last();
|
foreach (var wamsTask in wamsTasks) {
|
||||||
var lastWamsTask = wamsTasks.Where(task => task.Id == lastTask.WamsTaskId).Single();
|
var task = tasks[wamsTask.Id];
|
||||||
var outputAsset = lastWamsTask.OutputAssets.First();
|
task.Status = MapWamsJobState(wamsTask.State);
|
||||||
var outputAssetName = !String.IsNullOrWhiteSpace(job.OutputAssetName) ? job.OutputAssetName : lastWamsTask.Name;
|
task.PercentComplete = (int)wamsTask.Progress;
|
||||||
var outputAssetDescription = job.OutputAssetDescription.TrimSafe();
|
}
|
||||||
var encoderMetadataXml = _wamsClient.GetEncoderMetadataXml(outputAsset).Result;
|
|
||||||
var cloudVideoPart = job.CloudVideoPart;
|
|
||||||
var wamsLocators = _wamsClient.CreateLocatorsAsync(outputAsset, WamsLocatorCategory.Private).Result;
|
|
||||||
|
|
||||||
// HACK: Temporary workaround to disable dynamic packaging for VC1-based assets. In future versions
|
var previousStatus = job.Status;
|
||||||
// this will be implemented more robustly by testing all the dynamic URLs to see which ones work
|
var wamsJobErrors = HarvestWamsJobErrors(wamsJob).ToArray();
|
||||||
// and only store and use the working ones.
|
|
||||||
var forceNonDynamicAsset = lastWamsTask.Configuration.StartsWith("VC1");
|
|
||||||
|
|
||||||
if (wamsLocators.OnDemandLocator != null && !forceNonDynamicAsset) {
|
job.CreatedUtc = wamsJob.Created;
|
||||||
_assetManager.CreateAssetFor<DynamicVideoAsset>(cloudVideoPart, asset => {
|
job.StartedUtc = wamsJob.StartTime;
|
||||||
asset.IncludeInPlayer = true;
|
job.FinishedUtc = wamsJob.EndTime;
|
||||||
asset.Name = outputAssetName;
|
job.Status = MapWamsJobState(wamsJob.State);
|
||||||
asset.Description = outputAssetDescription;
|
job.ErrorMessage = GetAggregateErrorMessage(wamsJobErrors);
|
||||||
asset.EncodingPreset = lastTask.HarvestAssetName;
|
|
||||||
asset.WamsPrivateLocatorId = wamsLocators.SasLocator.Id;
|
|
||||||
asset.WamsPrivateLocatorUrl = wamsLocators.SasLocator.Url;
|
|
||||||
asset.WamsPrivateOnDemandLocatorId = wamsLocators.OnDemandLocator.Id;
|
|
||||||
asset.WamsPrivateOnDemandLocatorUrl = wamsLocators.OnDemandLocator.Url;
|
|
||||||
asset.WamsManifestFilename = wamsLocators.OnDemandManifestFilename;
|
|
||||||
asset.WamsAssetId = outputAsset.Id;
|
|
||||||
asset.WamsEncoderMetadataXml = encoderMetadataXml;
|
|
||||||
asset.UploadState.Status = AssetUploadStatus.Uploaded;
|
|
||||||
asset.PublishState.Status = AssetPublishStatus.None;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
_assetManager.CreateAssetFor<VideoAsset>(cloudVideoPart, asset => {
|
|
||||||
asset.IncludeInPlayer = true;
|
|
||||||
asset.Name = outputAssetName;
|
|
||||||
asset.Description = outputAssetDescription;
|
|
||||||
asset.EncodingPreset = lastTask.HarvestAssetName;
|
|
||||||
asset.WamsPrivateLocatorId = wamsLocators.SasLocator.Id;
|
|
||||||
asset.WamsPrivateLocatorUrl = wamsLocators.SasLocator.Url;
|
|
||||||
asset.WamsAssetId = outputAsset.Id;
|
|
||||||
asset.WamsEncoderMetadataXml = encoderMetadataXml;
|
|
||||||
asset.UploadState.Status = AssetUploadStatus.Uploaded;
|
|
||||||
asset.PublishState.Status = AssetPublishStatus.None;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
LogWamsJobErrors(wamsJobErrors);
|
||||||
if (cloudVideoPart.IsPublished())
|
|
||||||
_assetManager.PublishAssetsFor(cloudVideoPart);
|
if (job.Status != previousStatus) {
|
||||||
}
|
if (job.Status == JobStatus.Finished) {
|
||||||
catch (Exception ex) {
|
Logger.Information("Job '{0}' was finished in WAMS; creating locators.", wamsJob.Name);
|
||||||
Logger.Warning(ex, "Processing of job '{0}' was completed but an error occurred while publishing the cloud video item with ID {1} after processing.", wamsJob.Name, cloudVideoPart.Id);
|
|
||||||
|
var lastTask = job.Tasks.Last();
|
||||||
|
var lastWamsTask = wamsTasks.Single(task => task.Id == lastTask.WamsTaskId);
|
||||||
|
var outputAsset = lastWamsTask.OutputAssets.First();
|
||||||
|
var outputAssetName = !String.IsNullOrWhiteSpace(job.OutputAssetName) ? job.OutputAssetName : lastWamsTask.Name;
|
||||||
|
var outputAssetDescription = job.OutputAssetDescription.TrimSafe();
|
||||||
|
var encoderMetadataXml = _wamsClient.GetEncoderMetadataXml(outputAsset).Result;
|
||||||
|
var cloudVideoPart = job.CloudVideoPart;
|
||||||
|
var wamsLocators = _wamsClient.CreateLocatorsAsync(outputAsset, WamsLocatorCategory.Private).Result;
|
||||||
|
|
||||||
|
// HACK: Temporary workaround to disable dynamic packaging for VC1-based assets. In future versions
|
||||||
|
// this will be implemented more robustly by testing all the dynamic URLs to see which ones work
|
||||||
|
// and only store and use the working ones.
|
||||||
|
var forceNonDynamicAsset = lastWamsTask.Configuration.StartsWith("VC1");
|
||||||
|
|
||||||
|
if (wamsLocators.OnDemandLocator != null && !forceNonDynamicAsset) {
|
||||||
|
_assetManager.CreateAssetFor<DynamicVideoAsset>(cloudVideoPart, asset => {
|
||||||
|
asset.IncludeInPlayer = true;
|
||||||
|
asset.Name = outputAssetName;
|
||||||
|
asset.Description = outputAssetDescription;
|
||||||
|
asset.EncodingPreset = lastTask.HarvestAssetName;
|
||||||
|
asset.WamsPrivateLocatorId = wamsLocators.SasLocator.Id;
|
||||||
|
asset.WamsPrivateLocatorUrl = wamsLocators.SasLocator.Url;
|
||||||
|
asset.WamsPrivateOnDemandLocatorId = wamsLocators.OnDemandLocator.Id;
|
||||||
|
asset.WamsPrivateOnDemandLocatorUrl = wamsLocators.OnDemandLocator.Url;
|
||||||
|
asset.WamsManifestFilename = wamsLocators.OnDemandManifestFilename;
|
||||||
|
asset.WamsAssetId = outputAsset.Id;
|
||||||
|
asset.WamsEncoderMetadataXml = encoderMetadataXml;
|
||||||
|
asset.UploadState.Status = AssetUploadStatus.Uploaded;
|
||||||
|
asset.PublishState.Status = AssetPublishStatus.None;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
_assetManager.CreateAssetFor<VideoAsset>(cloudVideoPart, asset => {
|
||||||
|
asset.IncludeInPlayer = true;
|
||||||
|
asset.Name = outputAssetName;
|
||||||
|
asset.Description = outputAssetDescription;
|
||||||
|
asset.EncodingPreset = lastTask.HarvestAssetName;
|
||||||
|
asset.WamsPrivateLocatorId = wamsLocators.SasLocator.Id;
|
||||||
|
asset.WamsPrivateLocatorUrl = wamsLocators.SasLocator.Url;
|
||||||
|
asset.WamsAssetId = outputAsset.Id;
|
||||||
|
asset.WamsEncoderMetadataXml = encoderMetadataXml;
|
||||||
|
asset.UploadState.Status = AssetUploadStatus.Uploaded;
|
||||||
|
asset.PublishState.Status = AssetPublishStatus.None;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (cloudVideoPart.IsPublished())
|
||||||
|
_assetManager.PublishAssetsFor(cloudVideoPart);
|
||||||
|
}
|
||||||
|
catch (Exception ex) {
|
||||||
|
Logger.Warning(ex, "Processing of job '{0}' was completed but an error occurred while publishing the cloud video item with ID {1} after processing.", wamsJob.Name, cloudVideoPart.Id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
Logger.Information("Processing of job '{0}' was successfully completed.", wamsJob.Name);
|
Logger.Information("Processing of job '{0}' was successfully completed.", wamsJob.Name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,28 +5,25 @@ using System.Threading;
|
|||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using Orchard.Environment;
|
using Orchard.Environment;
|
||||||
using Orchard.Events;
|
using Orchard.Events;
|
||||||
using Orchard.Logging;
|
|
||||||
using Orchard.JobsQueue.Models;
|
using Orchard.JobsQueue.Models;
|
||||||
using Orchard.Services;
|
using Orchard.Logging;
|
||||||
using Orchard.TaskLease.Services;
|
using Orchard.Tasks.Locking.Services;
|
||||||
|
|
||||||
namespace Orchard.JobsQueue.Services {
|
namespace Orchard.JobsQueue.Services {
|
||||||
public class JobsQueueProcessor : IJobsQueueProcessor {
|
public class JobsQueueProcessor : IJobsQueueProcessor {
|
||||||
private readonly Work<IJobsQueueManager> _jobsQueueManager;
|
private readonly Work<IJobsQueueManager> _jobsQueueManager;
|
||||||
private readonly Work<IClock> _clock;
|
|
||||||
private readonly Work<ITaskLeaseService> _taskLeaseService;
|
|
||||||
private readonly Work<IEventBus> _eventBus;
|
private readonly Work<IEventBus> _eventBus;
|
||||||
private readonly ReaderWriterLockSlim _rwl = new ReaderWriterLockSlim();
|
private readonly ReaderWriterLockSlim _rwl = new ReaderWriterLockSlim();
|
||||||
|
private readonly IDistributedLockService _distributedLockService;
|
||||||
|
|
||||||
public JobsQueueProcessor(
|
public JobsQueueProcessor(
|
||||||
Work<IClock> clock,
|
|
||||||
Work<IJobsQueueManager> jobsQueueManager,
|
Work<IJobsQueueManager> jobsQueueManager,
|
||||||
Work<ITaskLeaseService> taskLeaseService,
|
Work<IEventBus> eventBus,
|
||||||
Work<IEventBus> eventBus) {
|
IDistributedLockService distributedLockService) {
|
||||||
_clock = clock;
|
|
||||||
_jobsQueueManager = jobsQueueManager;
|
_jobsQueueManager = jobsQueueManager;
|
||||||
_taskLeaseService = taskLeaseService;
|
|
||||||
_eventBus = eventBus;
|
_eventBus = eventBus;
|
||||||
|
_distributedLockService = distributedLockService;
|
||||||
Logger = NullLogger.Instance;
|
Logger = NullLogger.Instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,12 +32,15 @@ namespace Orchard.JobsQueue.Services {
|
|||||||
// prevent two threads on the same machine to process the message queue
|
// prevent two threads on the same machine to process the message queue
|
||||||
if (_rwl.TryEnterWriteLock(0)) {
|
if (_rwl.TryEnterWriteLock(0)) {
|
||||||
try {
|
try {
|
||||||
if (_taskLeaseService.Value.Acquire("JobsQueueProcessor", _clock.Value.UtcNow.AddMinutes(5)) != null) {
|
DistributedLock @lock;
|
||||||
IEnumerable<QueuedJobRecord> messages;
|
if(_distributedLockService.TryAcquireLockForMachine(GetType().FullName, TimeSpan.FromMinutes(5), out @lock)){
|
||||||
|
using (@lock) {
|
||||||
|
IEnumerable<QueuedJobRecord> messages;
|
||||||
|
|
||||||
while ((messages = _jobsQueueManager.Value.GetJobs(0, 10).ToArray()).Any()) {
|
while ((messages = _jobsQueueManager.Value.GetJobs(0, 10).ToArray()).Any()) {
|
||||||
foreach (var message in messages) {
|
foreach (var message in messages) {
|
||||||
ProcessMessage(message);
|
ProcessMessage(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ namespace Orchard.TaskLease.Services {
|
|||||||
/// Describes a service to save and acquire task leases. A task lease can't be acquired by two different machines,
|
/// Describes a service to save and acquire task leases. A task lease can't be acquired by two different machines,
|
||||||
/// for a specific amount of time. Optionnally a State can be saved along with the lease.
|
/// for a specific amount of time. Optionnally a State can be saved along with the lease.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Obsolete("Use Orchard.Tasks.Locking.IDistributedLockService instead.")]
|
[Obsolete("Use Orchard.Tasks.Locking.IDistributedLockService.AcquireForMachine instead.")]
|
||||||
public interface ITaskLeaseService : IDependency {
|
public interface ITaskLeaseService : IDependency {
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ namespace Orchard.TaskLease.Services {
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Provides a database driven implementation of <see cref="ITaskLeaseService" />
|
/// Provides a database driven implementation of <see cref="ITaskLeaseService" />
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Obsolete("Use Orchard.Tasks.Locking.DistributedLockService instead.")]
|
[Obsolete("Use Orchard.Tasks.Locking.DistributedLockService.AcquireForMachine instead.")]
|
||||||
public class TaskLeaseService : ITaskLeaseService {
|
public class TaskLeaseService : ITaskLeaseService {
|
||||||
|
|
||||||
private readonly IRepository<TaskLeaseRecord> _repository;
|
private readonly IRepository<TaskLeaseRecord> _repository;
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ namespace Orchard.Environment {
|
|||||||
builder.RegisterType<ViewsBackgroundCompilation>().As<IViewsBackgroundCompilation>().SingleInstance();
|
builder.RegisterType<ViewsBackgroundCompilation>().As<IViewsBackgroundCompilation>().SingleInstance();
|
||||||
builder.RegisterType<DefaultExceptionPolicy>().As<IExceptionPolicy>().SingleInstance();
|
builder.RegisterType<DefaultExceptionPolicy>().As<IExceptionPolicy>().SingleInstance();
|
||||||
builder.RegisterType<DefaultCriticalErrorProvider>().As<ICriticalErrorProvider>().SingleInstance();
|
builder.RegisterType<DefaultCriticalErrorProvider>().As<ICriticalErrorProvider>().SingleInstance();
|
||||||
builder.RegisterType<DefaultCriticalErrorProvider>().As<IThreadProvider>().SingleInstance();
|
builder.RegisterType<ThreadProvider>().As<IThreadProvider>().SingleInstance();
|
||||||
//builder.RegisterType<RazorTemplateCache>().As<IRazorTemplateProvider>().SingleInstance();
|
//builder.RegisterType<RazorTemplateCache>().As<IRazorTemplateProvider>().SingleInstance();
|
||||||
|
|
||||||
RegisterVolatileProvider<WebSiteFolder, IWebSiteFolder>(builder);
|
RegisterVolatileProvider<WebSiteFolder, IWebSiteFolder>(builder);
|
||||||
|
|||||||
Reference in New Issue
Block a user