2010-08-23 23 views
3

J'ai une application qui envoie des requêtes à un serveur COM hors de la procédure qui gère les requêtes et les renvoie à l'application demandeuse.Détection et résolution du blocage du serveur COM

L'application client contrôle réellement le démarrage-arrêt de ce serveur COM hors-procédure et détermine ainsi sa durée de vie. Parce que cette application a plusieurs centaines de demandes à la fois, elle a principalement au moins 4 des mêmes serveurs COM pour gérer ces demandes.

Le problème est que parfois ce serveur COM se bloque en gérant une requête, qui est interceptée par l'application qui demande, qui tue le serveur COM de sortie. Cependant, cela n'arrive pas toujours. Ce qui arrive parfois, c'est que l'application cliente demande un arrêt du serveur COM, ce qui fait que le client libère toutes les références au serveur COM, mais le serveur COM finit par utiliser seulement 25% du CPU et ne meurt jamais. Il semble qu'il se bloque et utilise le processeur en permanence.

Le client dispose d'un mécanisme pour tenter de forcer le processus du serveur COM s'il ne parvient pas à mourir, même si cela ne semble pas fonctionner dans les cas où le serveur COM se bloque.

Est-ce que quelqu'un a connu quelque chose de similaire ou a des conseils sur la façon dont on pourrait résoudre une situation comme celle-ci?

+0

Même question http://stackoverflow.com/questions/10691592/how-to-call-release-from-com-server –

Répondre

1

Vous devez concevoir tous les appels dans le serveur COM de telle sorte qu'ils se terminent tous dans un temps raisonnablement court. Dès qu'un nouvel appel arrive du client, COM génère un thread séparé et envoie un appel sur ce thread. Il n'y a pas de moyen fiable pour interrompre l'appel - l'appel doit se terminer sur lui-même (juste revenir). Vous y parvenez en concevant votre algorithme de manière appropriée.

+0

Donc vous dites que le hang processus COM pourrait être parce qu'un appel a été interrompu et ne peut plus se terminer lui-même correctement, comme le client a déjà déconnecté? –

+0

@Tony: Non, le serveur de traitement externe se bloque car l'appel a transmis le contrôle à un code qui n'a pas été renvoyé. Vous pouvez essayer vous-même - ajouter une boucle sans fin dans n'importe quelle implémentation de méthode COM et appeler cette méthode à partir d'un client. Vous pouvez tuer le client, mais le serveur fonctionnera au moins pendant une longue période de temps et je suppose qu'il fonctionnera pour toujours. – sharptooth

+0

OK, donc tous les appels COM doivent vraiment revenir avant que vous puissiez tuer le serveur de proc. Chose est que je n'ai pas vu un endroit où une boucle sans fin pourrait se produire dans mon serveur proc, donc même s'il n'y a pas une telle boucle, et l'appel ne revient pas, nous avons un problème? –