2010-11-24 9 views
1

je dois exécuter certaines activités /emplois dans mon serveur Web, telles que l'indexation des informations, organiser des fichiers, et le calcul des statistiques ...Mettre en œuvre un planificateur de tâches pour ASP.NET MVC

Je veux pour préserver la QoS dans mon serveur Web (performance, consommation de mémoire, ...). Donc, je pense à l'exécution d'un processus externe pour ces activités, au lieu d'appeler un thread. Quelque chose de similaire à Apache MPM processer (il lance des processus fils pour traiter les requêtes).

  • Vous connaissez la meilleure solution pour cela? Savez-vous une bibliothèque qui pourrait le faire pour moi?

Merci à l'avance.

Répondre

1

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.

1

Vous pouvez jeter un oeil à Quartz.NET qui vous permet de planifier les travaux qui seront exécutés sur le serveur. Pourriez-vous faire quelque chose comme ils utilisent sur les sites Stack Exchange?

+0

Je lis le document ... Est-ce que Quartz peut exécuter des tâches dans des processus séparés? –

+0

@Daniel, Quartz exécute des travaux, ces travaux peuvent générer des processus: 'Process.Start (" foo.exe ");'. –