Lade...
 

CXSENDMSG.EXE

CXSENDMSG.EXE

Das Programm cxsendmsg.exe (auch Cxsendmsg genannt) dient dem Senden von Messages an entfernte ClassiX® Instanzen via CORBA. Das Tool versucht, mit Hilfe des CORBA Naming Service (siehe auch CORBA Installation), Kontakt zu einer entfernten ClassiX® Instanz aufzunehmen und eine InstantView® Nachricht zu verschicken. Dabei wird ausschließlich die ClassiX®-Corba Schnittstelle benutzt. Die übliche Arbeitsweise ist es, eine oder mehrere Dateien an einen ClassiX®-Server zu senden und die Antwort in eine Datei zu schreiben. Cxsendmsg sendet seinen eigenen Corba-Namen zusammen mit der Nachricht mit. Beim Empfangen von Nachrichten erwartet Cxsendmsg gleichermaßen, das der Name des Senders mitgeschickt wird.

Gleichzeitig dient das Programm als Beispielimplementierung zur Nutzung der ClassiX® CORBA Schnittstelle.

Aufrufbeispiel:

Das Programm kann folgendermaßen aufgerufen werden:

cxsendmsg.exe -r <corbaname> -m <message> -- <dateiname>

Für ist dabei der Name der entfernten ClassiX®-Instanz einzusetzen. Dies ist wie fast im ganzen Rest des ClassiX®-Systems nicht der vollständige Corba-Name, sondern nur der letzte  Teil des Schemas "ClassiX//"RemoteMsg"/, also beispielsweise für "ClassiX/Auskunft/RemoteMsg/Classix1436" nur "Classix1436". Für ist der Name der zu sendenden Instantview ®-Nachricht einzusetzen, und muss den Pfad zu einer Datei angeben. Für diesen Aufruf tut Cxsendsmg folgendes: Erst wird die angegebene Datei eingelesen. Der Inhalt der Datei wird gemarshaled, d. h. so kodiert, dass ClassiX® erkennen kann, dass der Inhalt ein Element des InstantView-Stacks darstellen soll. Der gesamte Inhalt der Datei wird als ein Element auf dem Stack kodiert. Dann wird auch der Dateiname gemarshaled, dasselbe gilt für den Corba-Namen des sendenden Cxsendmsg. Der Dateiname wird ohne eventuelle Verzeichniskomponenten übermittelt (Z. b. wird aus "d:\data\a1.dat" "a1.dat"). Als nächstes versucht Cxsendmsg den Corba Naming-Service zu kontaktieren, um die angegebene ClassiX®-Instanz zu finden. Wenn dies erfolgt ist werden die gesammelten Daten an die Instanz gesendet, was einem Aufruf der Methode "SendMsg_CORBA(in string message, in MarshaledStack stack)" oder im asynchronen Fall "AcceptMsg_CORBA(in string message, in MarshaledStack stack)" des ClassiX® Corba-Interfaces bedeutet. Das erste Element, mit Index 0, von "stack" ist dabei der Dateiinhalt, dann folgt der Dateiname und dann der Corba-Name.

Nachdem all dies geschehen ist, wartet Cxsendmsg auf eine eintreffende Corba-Nachricht, die als Antwort des Servers (also der kontaktierten ClassiX®-Instanz) interpretiert wird. Wenn die Nachricht eintrifft, extrahiert Cxsendmsg den Dateinamen den der Server gewählt hat und die zugehörigen Daten und schreibt diese in die gewünschte Datei. Vorsicht! Existierende Dateien werden überschrieben. Cxsendmsg versucht zu erkennen, ob der empfangene Dateiname eine Verzeichnis-Komponente enthält und entfernt diese gegebenenfalls. So werden bei einem Aufruf ohne weitere Kommandozeilenargumente nur Dateien im Arbeitsverzeichnis von Cxsendmsg geschrieben. Es wird dennoch empfohlen, Cxsendmsg nicht mit unnötigen Rechten zu starten, und beim Testen neuer oder veränderter Messages die Kommandozeilenoption "-s" (siehe Tabelle unten) zu benutzen.

Die Arbeitsweise von Cxsendmsg lässt sicht durch Argumente auf der Kommandozeile anpassen. Unter anderem ist es möglich, die Reihenfolge in der Elemente auf den Stack gelegt werden zu vertauschen und es ist möglich pro Zeile einer Eingabedatei ein Stackelement zu erzeugen anstatt die ganze Datei in einem Element zu versenden. Die folgende Tabelle gibt die wichtigsten Kommandozeilenparameter an: (Bezeichner in spitzen Klammern sind beim Aufruf durch einen passenden Wert zu ersetzen)

Parameter Bedeutung
-r Der Corba-Name einer ClassiX® Instanz, so wie er von der Methode RemoteClients zurückgeliefert wird. Es kann "*" als Wildcard am Ende des Namens verwendet werden, um einen beliebigen Eintrag im NamingService zu wählen. Der Wert ist optional, wenn er weggelassen wird wird "*" angenommen.
-c Eine Datei die den Corba-Namen einer ClassiX® Instanz enthält. Wenn die erste Zeile der Datei "ClassiX" lautet (ohne Anführungszeichen), dann wird die zweite Zeile als Corba-Name interpretiert. Andernfalls ist die erste Zeile der Corba-Name.
-o Der Name des Projektes. Dieser Wer entspricht dem mittleren Teil der Hierarchie "ClassiX"//"RemoteMsg"/. Der Projektname ist optional.
-l Der Corba-Name, den das sendende Cxsendmsg benutzen soll. Wird zu "ClassiX/CorbaNameLokal/RemoteMsg" ergänzt. Sollte der gewählte Name bereits beim Naming-Service registriert sein, dann wird die alte Bindung überschrieben.
-m Der Name der InstantView-Nachricht die gesendet werden soll.
-p Ein Teil einer Pfadangabe der beim Abspeichern von Dateien dem empfangenen Dateinamen vorangestellt wird. Es wird empfohlen einen absoluten Pfad anzugeben.
-s Ein ergänzender Teil eines Dateinamens. Diese Ergänzung wird an den empfangenen Dateinamen angehängt, sofern der empfangene Namen keinen Punkt ('.') enthält. Andernfalls wird die Ergänzung dem letzten Punkt des Namens vorangestellt.
-i Die Art wie Dateiinhalte und andere Stackelemente gemarshaled, also für die Übertragung kodiert werden sollen. Die Voreinstellung kodiert alle Elemente als InstantView-String und benutzt ein Element für eine Eingabedatei. Für MarshalingModus können diese Angaben eingesetzt werden:

"singlefile" - Benutze ein Element pro Eingabedatei (Voreinstellung)
"linewise" - Benutze ein Element pro Zeile
"marshal" - Führe Marshaling durch (Voreinstellung)
"unmarshal" - Betrachte Eingabedaten als bereits gemarshaled und mache diese Kodierung rückgängig.

Diese Optionen können auch kombiniert werden, indem mehrere durch Kommas getrennt hintereinander angegeben werden. Es dürfen keine Leerzeichen zwischen diesen einzelnen Optionen sein. Beispiel "-i linewise,marshal" ist korrekt. Verkehrt hingegen wäre "-i linewise, marshal". Die Angaben "singlefile" und "linewise" schließen sich aus. Wenn sowohl "marshal" als auch "unmarshal" angegeben wird werden Eingabedaten die als InstantView-Integer kodiert sind in InstantView-Strings umgewandelt. Es ist zu vermeiden, andere als die oben aufgeführten Angaben zu benutzen.

-d Eine Datei in die Cxsendmsg Debuginformationen schreiben soll.
-R Kehrt die Reihenfolge von Dateinamens/Dateiinhalts-Paaren auf dem Stack um. Voreinstellung ist, dass zuerst der Inhalt gesendet wird und dann der Name. Außerdem ändert sich durch diese Option die Position des Corba-Namens des sendenden Cxsendmsg: Per Default wird der Corba-Name zuletzt gesendet, hinter allen Dateinamens/Dateiinhalts-Paaren. Mit dieser Option kommt der Corba-Name zuerst.
-O Zusätzlich zum Schreiben in Dateien werden empfangene Daten auch auf der Standard-Ausgabe des Programms ausgegeben. Alle Daten werden ohne weitere Trennzeichen hintereinander geschrieben.
-P Verhindert, dass tatsächlich in Dateien geschrieben wird. Ist dies durch die -d Option eingestellt, wird dennoch in die Debug-Datei geschrieben. Auch Standardausgabe und Standardfehlerausgabe bleiben von dieser Option unberührt.
-K Ohne diese Option beendet sich Cxsendmsg spätestens nachdem die erste Corba-Nachricht empfangen wurde. Mit dieser Option wartet Cxsendmsg auf eine unbegrenzte Anzahl von Nachrichten, sofern nicht durch die Option "-S" bestimmt wurde, dass überhaupt keine Nachrichten entgegengenommen werden sollen.
-S Weist Cxsendmsg an, nicht auf eintreffende Nachrichten zu warten.
-N Mit dieser Option wird entgegen der üblichen Arbeitsweise keine Nachricht gesendet.
-C Überprüft beim Eintreffen von Nachrichten, ob die Anzahl der empfangenen Stackelemente ungerade ist. Wenn dies nicht der Fall ist, wird ein Hinweis ausgegeben.
-t Auf diese Option muss ein Argument folgen welches auf dem Stack mitgesendet wird. Das Argument wird gesendet wie von der Kommandozeile erhalten; es wird nicht gemarshaled. Wenn die Option -T nicht verwendet wird, ist dieses Element das zweitoberste auf dem Stack. Wenn die -T Option verwendet wird, dann wird dieses Element das zweit- oder drittoberste.
-T Auf diese Option muss ein Argument folgen welches auf dem Stack mitgesendet wird. Das Argument wird als InstantView String gemarshaled gesendet, unabhängig davon, welcher Marshaling-Modus mit der -i Option eingestellt wurde. Wenn die Option -t nicht verwendet wird, ist dieses Element das zweitoberste auf dem Stack. Wenn die -t Option verwendet wird, dann wird dieses Element das zweit- oder drittoberste.
-- <Datei1> [<Datei2> ...]
Nach zwei Mittestrichen dürfen nur noch Pfade zu Eingabedateien folgen. Wird dieses Kommandozeilenargument benutzt, dann muss mindestens eine Eingabedatei bestimmt werden. Ohne dieses Argument wird eine leerer Stack zusammen mit der InstantView-Nachricht gesendet. Mehrere Dateien können getrennt durch Leerzeichen angegeben werden.

Es sollte vermieden werden, andere als die in der Tabelle erwähnten Argumente zu übergeben.

Diagnosemeldungen

Während Cxsendmsg ausgeführt wird kann eine Vielzahl von Problemen auftreten, wie z. B. Nichtauffindbarkeit einer als Eingabe gedachten Datei, nicht erlaubte Optionen auf der Kommandozeile, Fehlschlagende Kontaktierung des Corba Namingservice und Anderes. Viele dieser Probleme können von Cxsendmsg erkannt werden. In diesen Fällen gibt das Programm eine Diagnosemeldung auf die Standardfehler-Ausgabe aus. Solche Meldungen werden nicht auf die Standardausgabe geschrieben. Ausgaben, die aufgrund der Kommandozeilen- Option "-O" getätigt werden, werden nur auf die Standardausgabe geschrieben. Nur Meldungen die von externen Bibliotheken stammen können von dieser Konvention abweichen. Diagnosemeldungen werden in der Regel durch die Wörter Error und Attention in spitzen Klassern eingeleitet (<>, <>).  Nach einem Error beendet sich Cxsendmsg ohne weitere Nachrichten zu senden oder zu empfangen.

Die folgende Tabelle gibt einige Diagnosemeldungen und die jeweilige Bedeutung an:

Meldung Bedeutung Abhilfe/Vorgehen
Illegal command line: ...Details... ...Benutzungshinweise... Ein Argument auf der Kommandozeile ist ungültig oder die Anzahl von Argumenten ist zu gering. Weitere Hinweise folgen auf diese Meldung. Cxsendmsg mit einer gültigen Kommandozeile aufrufen.
Failed to read from remote Corbaname file. Es wurde ein Dateiname zum Auslesen des Empfängers angegeben, jedoch konnte von dieser Datei nicht gelesen werden. Überprüfen Sie, ob die Datei existiert und Leserechte vorhanden sind.
Not sending any input files. Diese Meldung deutet nicht unbedingt auf einen Fehler hin: Es wurden keine Dateien zum Senden bestimmt.  
Both -N and -S options were specified. Diese Meldung deutet nicht unbedingt auf einen Fehler hin: Cxsendmsg soll weder Nachrichten senden noch empfangen. Entscheiden Sie, ob ein leerer Aufruf tatsächlich gewünscht ist.
Failed to initialize ACE. Eine wichtige Bibliothek konnte nicht in Betrieb gesetzt werden.  
A failure occured while reading data to transfer from file. The name of the file is: ...Dateiname... ...Weiteres.... Ein Fehler trat beim Lesen aus einer Eingabedatei auf. Der Name der Datei ist angegeben. Es folgen weitere Informationen, die jedoch nicht zwangsläufig den genauen Grund des Fehlers angeben. Überprüfen Sie, ob die angegebene Datei existiert und Leserechte vorhanden sind.
Failed to register local interface with Naming Service. Der Corba-Servant von Cxsendmsg konnte nicht am Corba Naming-Service angemeldet werden. Überprüfen Sie, ob die Netzwerkverbindung stabil ist und der Naming-Service noch arbeitet.
A received message was invalid. Das Warten auf Nachrichten wurde abgebrochen weil die letzte empfangene Nachricht nicht korrekt aufgebaut ist. Überprüfen sie, ob das Format der Nachricht stimmt.
Opening an output file failed. The name of the file is: ...Dateiname... ...Weiteres... Eine Datei zum Ausgeben empfangener Daten konnte nicht erzeugt werden. Der Name der Datei ist angegeben. Es folgen weitere Informationen, die jedoch nicht zwangsläufig den genauen Grund des Fehlers angeben. Überprüfen Sie, ob eine gültiger Name gesendet wurde und ob Schreibrechte für die Datei vorhanden sind.
Writing to an output file failed. The name of the file is: ...Dateiname... ...Weiteres... Ein Fehler trat beim Schreiben in eine geöffnete  Ausgabedatei auf. Der Name der Datei ist angegeben. Es folgen weitere Informationen, die jedoch nicht zwangsläufig den genauen Grund des Fehlers angeben. Überprüfen Sie, ob genügend freier Platz auf dem Laufwerk vorhanden ist.
An unknown error occured while receiving messages. Ein Fehler trat während des Bearbeitens einer Nachricht auf.  
A memory allocation failed while processing remote messages. Während des Bearbeitens einer Nachricht schlug eine Speicheranforderung fehl. Überprüfen Sie, ob ausreichend Arbeitsspeicher vorhanden sind. Freier Speicher muss die Größe der Nachricht übersteigen.
An exception occured while processing remote messages. ...Details... ...Typ der Ausnahme... Eine Fehler trat während des Bearbeitens einer Nachricht auf. Details zum Fehler sind verfügbar.  
The specified ClassiX-Instance was not found. Unter dem angegebenen Namen konnte keine entfernte ClassiX-Instanz gefunden werden. Überprüfen Sie, ob die von Ihnen angegebene Instanz läuft und registriert ist.
CORBA exception caught: ...Details... Die Kommunikation per Corba brach ab. Es folgen weitere Angaben zum Fehler.

 

Überprüfen Sie, ob die Details den Text "IDL:omg.org/CORBA/TRANSIENT" enthalten. Wenn ja, dann ist es vermutlich nicht möglich den Corba Naming-Service zu benutzen. In diesem Fall sollte überprüft werden ob der Naming-Service läuft und über das Netzwerk erreichbar ist. Eine weitere, ebenfalls wahrscheinliche Ursache ist, dass eine bisher am Naming-Service registrierte ClassiX-Instanz sich terminiert hat, ohne sich abzumelden.
Caught exception: ...Details... ...Typ der Ausnahme... Ein Fehler trat auf. Es folgen weitere Informationen die Näheres über die Art des Fehlers verraten können. Der Fehler trat vermutlich beim oder vor dem Senden auf, nicht beim Empfangen.  
A memory allocation failed. Eine Speicheranforderung schlug fehl. Der Fehler trat vermutlich beim Senden, nicht beim Empfangen auf. Überprüfen Sie, ob ausreichend Arbeitsspeicher vorhanden ist. Freier Speicher muss die Größe der Nachricht übersteigen.
Unknown exception caught. Ein Fehler trat auf. Details konnten nicht bestimmt werden.  
Stack length is even Der Empfänger antwortete mit einer Nachricht deren Stack eine gerade Anzahl von Argumenten enthält. Diese Meldung wird nur ausgegeben wenn die Kommandozeilenoption -C benutzt wurde.

Neben Diagnosemeldungen die mit Error oder Attention beginnen, gibt Cxsendmsg auch weitere Informationen zu Arbeitschritten und empfangenen Daten aus. Die Ausführlichkeit dieser Ausgaben kann sich von Revision zu Revision ändern. Diese Meldungen gelten als Diagnosemeldungen und werden dementsprechend auf die Standardfehler-Ausgabe geschrieben.
Sollten Sie Fehlermeldungen erhalten, die nicht durch <> eingeleitet werden, dann verwenden Sie möglicherweise eine ältere Version von Cxsendmsg.

Skalierbarkeit und Ausfallsicherheit

Durch Ausnutzen der Namenshierarchie kann sehr einfach eine Anwendung skaliert und fehlertolerant gemacht werden:

Es können mehrere ClassiX-Server gestartet werden, die sich alle unter demselben Projekt anmelden (in diesem Fall sollte kein SetName aufgerufen werden, da die Namen eindeutig sein müssen). cxsendmsg wird dann mit "-o -r *" aufgerufen (oder ganz ohne -r) und wählt sich zufällig einen Server. Von diesem wird die entsprechende Methode SendMsg_CORBA oder AcceptMsg_CORBA aufgerufen. Tritt dabei ein Fehler (z.B. Timeout oder Netzwerkabbruch) auf wird geprüft, ob die Nachricht verarbeitet worden ist (ein Flag in der Exception). Wenn nicht wird der entsprechende Eintrag aus dem Namensdienst entfernt und ein neuer Versuch mit einem anderen Server gestartet.

Um sicherzustellen, dass immer genügend ClassiX-Server für ein Projekt vorhanden sind kann der CORBA-Controller (das Programm cxcctrl.exe) verwendet werden.

 

Das Vorhandensein entsprechend vieler ClassiX-

Siehe auch

Hinweise zur Installation des Corba NamingService
Die Corbaschnittstelle von ClassiX®