2013-03-14 6 views
10

Beim Implementieren von erhalten Sie drei Ereignisse.Korrelieren von IComMethodEvents

  1. OnMethodCall
  2. OnMethodException
  3. OnMethodReturn

Ziel, was ich versuche zu tun, Anrufzeiten pro Verfahren in COM + -Komponenten protokollieren.

Die Zeit des Ereignisses kann in beide, indem Sie die Zeit so unter Verwendung lTime und lMicroTime in der COMSVCSEVENTINFO Struktur abgerufen werden OnMethodCall und in OnMethodReturn sollte ich in der Lage sein, die Anrufzeit zu berechnen, aber wie kann ich sicher sein, dass die beiden Ereignisse sind miteinander verknüpft.

Durch die Prüfung sieht es so aus, als ob ich in der Lage wäre, das Just-in-Time (JIT) aktivierte Objekt oid zu verwenden.

Haben Sie Probleme damit oder gibt es andere Möglichkeiten?

Ein Problem, das sein könnte, ist, dass ich sehe, die oid wird häufig wiederverwendet, so dass wenn die Ereignisse aus irgendeinem Grund ausgelöst wird, könnte es etwas schwieriger sein, die Korrelation zu implementieren.

Update 1:

Weitere Tests zeigen, dass oid in einer Multi-User-Szenario ist nicht genug. Das gleiche Objekt wird gleichzeitig verwendet, so dass die Korrelation unter Verwendung von mindestens oid und original caller erfolgen muss. Eine weitere Frage wäre: Wie bekomme ich den ursprünglichen Anrufer von einem COM + -Ereignisteilnehmer?

Update 2:

gefunden Nur IComMethod2Events. Der Unterschied besteht darin, dass die Ereignisse eine Kennung des Threads haben, der den Aufruf ausführt. Sieht in Tests vielversprechend aus und ich kann mir kein Szenario vorstellen, in dem die Korrelation fehlschlagen könnte. Das Threadingmodell für die COM + -Komponenten lautet Any Apartment.

aktualisieren 3

In diesem Artikel Creating COM+ PerfMon Counters to Monitor COM+ Dataoid verwendet wird. Ich denke nicht, dass das in einer Multithread-Wohnung reicht.

Hinweis: Ich werde dies in Delphi eventuell implementieren, also habe ich das Delphi-Tag hinzugefügt. Ich fügte auch das C# -Tag hinzu, weil die Wahrscheinlichkeit hoch ist, dass die zur Implementierung der Schnittstelle verwendete Sprache überhaupt nicht wichtig ist. Update: Vorläufig das C++ - Tag hinzufügen, nur um die Aufmerksamkeit von jemandem zu bekommen, der dieses Zeug schon einmal benutzt hat.

+0

Ein Tool zum Überwachen von COM + -Transaktionen: ['AppMetrics'] (http://www.xtremesoft.com/solutions/white_paper_transactions.html). Vielleicht nützlich und Sie können herausfinden, wie sie das Monitoring machen. –

+0

Diese Seite kann auch hilfreich sein, ['MSDN COM + Tracking] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd179218 (v = vs.85) .aspx). –

+0

@LURD danke für die Links. Lesen Sie ein wenig von der MSDN-Verknüpfung und COM + Instrumentation führt Sie schließlich zu den Ereignissen in der Q. COM + Tracking können Sie die Daten erhalten COM + sammelt für Sie, sondern nur auf Komponentenebene (denke ich). –

Antwort

2

... wenn die Ereignisse aus irgendeinem Grund aus der Ordnung ...

Sie tun nie abgefeuert werden. Der COM + -Systemereignisherausgeber löst diese Ereignisse mithilfe des COM + -Ereignisdiensts aus. Der Aufruf eines Ereignisses erfolgt synchron aus Sicht des Ereignisherausgebers. Wenn ein Publisher ein Ereignis auslöst, wird nicht mit dem nächsten fortgefahren, bis alle Abonnenten die Verarbeitung des ausgelösten Ereignisses abgeschlossen haben. Ganz natürlich, OnMethodReturn/OnMethodException Ereignisse werden nicht veröffentlicht, bevor OnMethodCall diejenigen übereinstimmen. Ich erinnere mich an das Lesen von KBs bezüglich der Rennbedingungen/kaputten Abonnements in COM + -Events. All diese Fehler wurden meines Wissens in verschiedenen Service Packs für Windows 2000 behoben. Allerdings versuche ich nicht, in diesem Bereich auf dem neuesten Stand zu bleiben.

Wenn Sie IComMethod2Events implementieren, abonnieren Sie das gleiche transiente Abonnement wie für IComMethodEvents. Die Reihenfolge der gefeuerten Ereignisse ist also auch gleich.

... so hat Korrelation mindestens oid und original caller ...

An dieser Stelle getan werden, indem ich bin wirklich nicht sicher, ob Sie richtig Ergebnisse Ihrer Tests durchführen interpretieren. Wie testest du genau?

oid sollte bereits alle erforderlichen Informationen kapseln, auch im "multiple clients" -Szenario mit JIT und Pooling. Das letzte Mal, dass ich einen solchen Ereignis-Listener implementiert habe (es ist eine Weile her), hat sich oid gut bewährt. Obwohl die Mehrheit der Komponenten in meiner Umgebung in VB6 geschrieben wurde (daher lebte in STA). Doch selbst mit STA können Sie mehrere Anrufe in verschiedenen Ausführungsstadien über einen einzigen Thread ausführen. Da es eine Obergrenze für die Anzahl der Threads in COM + STA-Threadpool gibt, können Sie die folgende Situation haben: Anruf A startet auf bestimmten Thread, Anruf B beginnt auf dem gleichen Thread, Anruf B gibt zurück, Anruf A gibt zurück. Ich kann mich nicht erinnern, dass Probleme bei der Verfolgung der Anrufe durch oid ohne "einige zusätzliche Informationen über den Anrufer".

Implementierungsidee, die Sie betrachten, ist im Großen und Ganzen kanonisch. COM+ spy Das Beispiel, das mit Platform SDKs geliefert wird, verwendet das Argument oid, um einzelne Aufrufe zu verfolgen. Sie können die Quellen der Anwendung in <Path to SDK samples>\Samples\com\administration\spy finden. Das Beispiel verwendet diese Implementierung seit einiger Zeit (seit mindestens Windows 2003). Und heute ist es Äonen nach MTA und sogar COM + Einführung. Sollte es Fehler geben, würde die Probe zu diesem Zeitpunkt aktualisiert werden. Hoffnungsvoll.

+0

Danke für die Antwort. Du hattest meine Tests in Frage gestellt. Ich kann nicht reproduzieren, was ich vorher gesehen habe, also habe ich wahrscheinlich vorher einen dummen Fehler gemacht. Ich dachte, ich sah ein zweites * call * -Ereignis für ein 'oid' vor dem' return' -Ereignis beim ersten Anruf. –

1

Der MSDN-Link "Creating COM+ PerfMon Counters to Monitor COM+ Data" scheint ziemlich viel zu tun, was für Sie wollen (obwohl in Managed C++ glaube ich).

Der relevante Teil ist dies, ich denke:

void IComMethodEvents.OnMethodCall(ref COMSVCSEVENTINFO ei, ulong 
    lObjID, ref Guid gClsID, ref Guid gIID, uint nIndex) 
{ 
    //Make sure that monitoring is enabled and that our performance 
    //counter has been initialized. 
    if (Monitor && pcMethodDuration != null) 
    { 
    try 
    {      
     //We are going to store the initial value in a Sorted List 
     //collection. To do this we are going to need a key that 
     //represents this call. 
     string strKey = lObjID.ToString() + gClsID.ToString() + 
      gIID.ToString() + nIndex.ToString(); 

Dies ist die Lösung sein könnte, um Ihr Nachdenken über oid (lObjID in ihrem Beispiel). Ich weiß nicht, ob dies Ihr Multi-User-Szenario abdeckt, Sie müssen es versuchen. Die Seite hat ziemlich viele Details zu dem Thema, also hoffentlich können Sie es herausfinden. Viel Glück.

+1

Ja, das war der Artikel, auf den ich in Update 3 der Frage Bezug genommen habe. Ich glaube, es wird nicht so funktionieren. Was wirklich schön wäre, ist eine Dokumentation darüber, warum die IComMethod2Events-Schnittstelle hinzugefügt wurde. Ich vermute, dass es da ist, um die Korrelationsprobleme in einer MTA zu lösen, aber ich habe nichts darüber gefunden. –

+0

Ah, tut mir leid - du hast Recht. :) Mein Fehler. Ich habe keine Erfahrung mit dieser Schnittstelle, deshalb kann ich Ihnen nicht helfen, aber ich schlage vor, eine einfache Multithread-App zu erstellen und den Ansatz ("Creating COM + PerfMon Counters ...") zu testen, um zu sehen, ob es wie erwartet funktioniert oder nicht. Wie ist es damit? –

+0

Ja, ich habe genau das (wieder) mit anderen Ergebnissen gemacht, wie Sie in einem Kommentar zu der anderen Antwort sehen können. Ich muss einen dummen Fehler gemacht haben, als ich das erste Mal getestet habe. Danke für die Zeit, die Sie damit verbracht haben, meine Frage zu beantworten. –

Verwandte Themen