9
votes

Plusieurs instances de la même application qu'un service Windows?

J'ai une application qui gère le traitement lourd pour mon projet et doit le convertir en "Service Windows". Je dois permettre d'exécuter plusieurs versions des instances du traitement de l'application, ce qui semble être une exigence relativement normale.

Je peux voir au moins trois approches pour le faire:

  1. Créer un répertoire installé unique (EXE, DLLS, config), mais Installez comme plusieurs les instances de celui-ci.
  2. Demandez à un seul Services Spawn Spawn Plusieurs instances de soi après le lancement, A Apache.
  3. Demandez à un seul SERVICES SPOWN multiples threads qui fonctionnent dans le même espace de processus.

    Mon intention était une approche n ° 1, mais j'ai continué à trébucher sur les limitations, à la fois dans la conception et en particulier la documentation pour Services :

    • sont des paramètres jamais transmis à Onstart () par les mécanismes de services normaux sur un système sans surveillance? Si oui, quand / pourquoi?
    • Passage des paramètres d'exécution via le registre ImageKey Registry semble un KLUDGE, existe-t-il un meilleur mécanisme?
    • J'ai eu l'application pour installer / désinstaller elle-même comme une paire de services ("xyz # 1", "xyz # 2", ...), en utilisant le imagekey pour la montrer une commande Numéro d'instance de paramètre de ligne ("-X 1", "-X 2") mais je manquais quelque chose. Lors de la tentative de démarrage du service, cela échouerait avec " le programme exécutable que ce service est configuré pour exécuter ne met pas en œuvre le service .

      Alors, les questions:

      1. Y a-t-il une description concise de ce qui se passe lorsqu'un service commence, en particulier pour ces situations où le serveur n'est pas codé dur (voir Q ci-dessus).
      2. Quelqu'un a-t-il utilisé une approche n ° 1 avec succès? Tout commentaire?

        Remarque: Je suis à l'échelle du problème en utilisant l'approche n ° 3, je ne peux donc pas justifier beaucoup de temps à comprendre. Mais je pensais que quelqu'un pourrait avoir des informations sur la manière de mettre en œuvre # 1 - ou de bonnes raisons pour lesquelles ce n'est pas une bonne idée.

        [edit] J'avais à l'origine une 4ème option ( Installez plusieurs copies de l'application sur le disque dur ) mais je l'ai supprimé car il se sent juste, um, hackish . C'est pourquoi j'ai dit " au moins trois approches ".

        Toutefois, à moins que l'application ne soit recompilée, elle doit définir de manière dynamique son servicon, donc qui a la solution à la troisième balle / problème ci-dessus. Ainsi, sauf si une instance nécessaire pour modifier ses fichiers d'installation, # 1 devrait fonctionner correctement avec n de fichiers de configuration dans le répertoire et une entrée de registre indiquant que l'instance doit utiliser.


0 commentaires

3 Réponses :


6
votes

Bien que je ne puisse pas répondre à vos questions spécifiques à l'option n ° 1, je peux vous dire que l'option n ° 2 a très bien fonctionné pour nous. Nous voulions créer un domaine d'application pour chaque service «enfant» à exécuter sous et pour chacun d'entre eux d'utiliser un fichier de configuration différent. Dans le fichier de configuration de notre service, nous avons enregistré les domaines de l'application pour démarrer et le fichier de configuration à utiliser. Donc, pour chaque entrée, nous avons simplement créé le domaine de l'application, définissez le fichier de configuration, etc., nous sommes allés. Cette séparation de la configuration nous a permis de spécifier facilement les emplacements des ports et des fichiers journaux uniquement pour chaque instance. Des avantages supplémentaires pour nous, c'est que nous avons écrit notre «service enfant» comme une ligne de commande EXE et appelé simplement l'exécuté d'AppDomain () sur un nouveau fil pour chaque service «enfant». La seule "clique" de la solution a été arrêtée, nous n'avions pas la peine de créer une "bonne" solution pour cela.

mise à jour février, 2012

Il y a quelque temps, nous avons commencé à utiliser des services «nommés» (comme SQL Server). J'ai détaillé tout le processus sur mon blog dans une série "Construire un service Windows - Partie 1 via Partie 7 ". Ils vous prennent en créant un service de ligne de commande / Windows Hybrid complet avec une auto-installation. Les objectifs suivants où se sont rencontrés:

  • Construire un service pouvant également être utilisé à partir de la console
  • Journalisation appropriée des événements de service de démarrage / arrêt et d'autres activités
  • permettant de multiples instances en utilisant des arguments de ligne de commande
  • Installation automatique du service et du journal des événements
  • Journalisation appropriée des événements d'exceptions de service et d'erreurs
  • Contrôle des options de démarrage, d'arrêt et de redémarrage
  • Manipulation des commandes de service personnalisées, de l'énergie et des événements de session
  • Customizing Service Security and Access Control

    Un modèle complet de projet Visual Studio est disponible dans le dernier article de la série Construction d'un service Windows - Partie 7: Touches de finition .


0 commentaires

0
votes

Consultez cette sortie: Multiple Instance Windows Service


1 commentaires

C'est la solution "Installer une application multiple" ".



0
votes

Il y a l'option n ° 4 que j'utilise avec succès dans mon projet aka "Instances nommées".

Chaque installation de votre application a un nom personnalisé et chaque installation a son propre service. Ils sont complètement indépendants et isolés les uns des autres. MS SQL Server utilise ce modèle si vous essayez de l'installer plusieurs fois sur une seule machine.


3 commentaires

En fait, cela ne consiste pas simplement à ajouter des instances Service , mais ajoute Installations chacune avec un autre nom de serviconf. Mais étant donné que cette approche résout le problème "ServiceName de jeu de dynamisme" que j'ai frappé, cela signifie que # 1 peut être fait. Cependant, il me semble que # 1 serait plus facile (si seulement pour l'utilisateur final) - installer simplement les fichiers / l'emballage une fois, puis installez plusieurs services à partir de celui-ci. présumer les instances ne nécessite pas de différences étendues dans les fichiers dans le répertoire d'installation


Je sais mais vous avez dit que vous avez besoin de plus de services car il existe éventuellement plusieurs versions de votre application. Pourquoi rendre les choses compliquées en dégageant toutes les versions dans un seul dossier. Si vous supposez que toutes vos versions seront compatibles à l'avenir avec ce qui se trouve dans votre répertoire d'installation unique, allez-y, mais c'est une chose dangereuse pour assumer quelque chose dans le développement de logiciels à moins que cela ne soit basé sur une base mathématique solide et ce n'est pas le cas: )


Désolé de vous déranger, j'ai eu une faute de frappe: je voulais dire plusieurs instance de la même version la même version , pas "plusieurs versions", comme je l'ai initialement indiqué. Il n'y aura jamais plus d'une version installée.