|
using System;
using log4net;
using Raven.Database.Extensions;
using Raven.Database.Storage;
using Raven.Database.Tasks;
namespace Raven.Database.Indexing
{
public class TaskExecuter
{
private readonly WorkContext context;
private readonly ILog log = LogManager.GetLogger(typeof (TaskExecuter));
private readonly TransactionalStorage transactionalStorage;
public TaskExecuter(TransactionalStorage transactionalStorage, WorkContext context)
{
this.transactionalStorage = transactionalStorage;
this.context = context;
}
public void Execute()
{
while (context.DoWork)
{
var foundWork = false;
transactionalStorage.Batch(actions =>
{
log.Debug("Trying to find a task to execute");
var taskAsJson = actions.GetFirstTask();
if (taskAsJson == null)
{
log.Debug("Could not find any task to execute, will wait for more work");
actions.Commit();
return;
}
log.DebugFormat("Executing {0}", taskAsJson);
foundWork = true;
ExecuteTask(taskAsJson);
actions.CompleteCurrentTask();
actions.Commit();
});
if (foundWork == false)
context.WaitForWork();
}
}
private void ExecuteTask(string taskAsJson)
{
try
{
var task = Task.ToTask(taskAsJson);
try
{
task.Execute(context);
}
catch (Exception e)
{
log.WarnFormat(e, "Task {0} has failed and was deleted without completing any work", taskAsJson);
}
}
catch (Exception e)
{
log.ErrorFormat(e, "Could not create instance of a task: {0}", taskAsJson);
}
}
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
I've been a software developer since 1996 and have enjoyed C# since 2003. I have a Bachelor's degree in Computer Science and for some reason, a Master's degree in Business Administration. I currently do software development contracting/consulting.
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.