Eh bien, je me suis finalement mis en place un système pour exécuter des tâches/emplois dans un processus externe.
Si quelqu'un veut savoir comment je l'ai implémenté, voici quelques détails. Peut-être que je vais écrire un article pour partager la solution et le code source.
Fondamentalement, nous avons deux composants, l'Web.dll
(application ASP.NET) et un programme appelé TaskExecutor.exe
Dans le Web.dll
, il y a un planificateur d'activité qui peut enregistrer des tâches par nom: par exemple:
ActivityScheduler.Get().RegisterActivity("GenerateSearchIndexes", 4 * 1000 * 60 * 60); //each 2 hours
le planificateur d'activités exécute chaque activité dans un fil, et ce fil appelle un processus externe, le ActivityExecutor.exe
cet ensemble comporte une référence à la Web.dll
qui a une ActivityFactory statique pour obtenir les activités. Le code source du processus externe est assez simple:
public static void Main (string[] args)
{
try
{
if (args.Length == 0)
{
throw new ArgumentException("No activity name given", "ActivityName");
}
//parameter 0 is the activity name
string activityName = args[0];
IScheduledActivity activity = ActivityFactory.GetActivity(activityName);
if (activityName != null)
{
activity.Execute(args);
}
}
catch (Exception ex)
{
Console.WriteLine("Error executing activity: " + ex.Message);
}
}
Comme vous pouvez le deviner la restriction est ici que les activités doivent être définies de manière statique, donc ils ne peuvent pas recevoir paramenters dans son constructeur. Les sont passés dans la méthode IScheduledActivity.Schedule(string[] args)
, de la même manière qu'un programme le ferait.
Je lis le document ... Est-ce que Quartz peut exécuter des tâches dans des processus séparés? –
@Daniel, Quartz exécute des travaux, ces travaux peuvent générer des processus: 'Process.Start (" foo.exe ");'. –