Überlegungen zur Programmiersprache C++
Beachten Sie die folgenden Aspekte der C++-Sprachverwendung und Konventionen, wenn Sie Anwendungsprogramme schreiben, die das MQI (Message Queue Interface) verwenden.
C++ Headerdateien
| Dateiname | Inhalt |
|---|---|
| IMQI.HPP | C++ MQI Klassen (schließt CMQC.H und IMQTYPE.H ein) |
| IMQTYPE.H | Definiert den Datentyp ImqBoolean |
| CMQC.H | MQI-Datenstrukturen und Manifestkonstanten |
#include-Vorprozessoranweisung den Namen der Headerdatei in Kleinbuchstaben:#include <imqi.hpp> // C++ classes
C++-Methoden und Attribute
Parameter von Methoden, die const sind, sind nur für die Eingabe gedacht. Parameter mit Signaturen, die einen Zeiger (*) oder eine Referenz (&) enthalten, werden per Referenz übergeben. Rückgabewerte, die keinen Zeiger oder Verweis enthalten, werden als Wert übergeben; bei zurückgegebenen Objekten handelt es sich um neue Entitäten, die in die Verantwortung des Aufrufers fallen.
Einige Methodensignaturen schließen Elemente ein, die einen Standard erhalten, wenn nichts angegeben wurde. Solche Elemente befinden sich immer am Ende von Signaturen und werden von einem Gleichheitszeichen (=) angegeben; der Wert nach dem Gleichheitszeichen ist der Standardwert, der angewendet wird, wenn das Element übergangen wird.
Bei allen Methodennamen ist Groß-/Kleinschreibung gemischt, mit Kleinbuchstaben am Anfang. Jedes Wort, mit Ausnahme des ersten innerhalb eines Methodennamens, fängt mit einem Großbuchstaben an. Abkürzungen werden nicht verwendet, außer ihre Bedeutung ist weitgehend bekannt. Zu den verwendeten Abkürzungen gehören id (für Identität) und sync (für Synchronisation).
Der Zugriff auf Objektattribute erfolgt über die Methoden set und get. Eine Set-Methode beginnt mit dem Wort set; eine Get-Methode hat kein Präfix. Wenn ein Attribut schreibgeschützt ist, verfügt es nicht über eine Set-Methode.
Attribute werden während der Objekterstellung zu einem gültigen Status initialisiert, und der Status eines Objekts ist immer konsistent.
Datentypen in C++
Alle Datentypen werden von der C-Anweisung typedef definiert.
Der Typ ImqBoolean wird in IMQTYPE.H als unsigned char definiert und kann die Werte WAHR und FALSCH aufweisen. Sie können ImqBinary-Klassenobjekte anstelle von MQBYTE-Arrays verwenden und ImqString-Klassenobjekte anstelle von char *. Viele Methoden geben Objekte anstelle von char- oder MQBYTE-Zeigern zurück, um die Speicherverwaltung zu erleichtern. Alle Rückgabewerte gehen in die Verantwortung des Aufrufers über, und für ein zurückgegebenes Objekt können Sie den Speicher mit delete entsorgen.
Bearbeiten von Binärzeichenfolgen in C++
#include <imqi.hpp> // C++ classes
ImqMessage message ;
ImqBinary id, correlationId ;
MQBYTE24 byteId ;
correlationId.set( byteId, sizeof( byteId ) ); // Set.
id = message.id( ); // Assign.
if ( correlationId == id ) { // Compare.
...
Bearbeiten von Zeichenfolgen in C++
Zeichendaten werden häufig in Objekten der Klasse ImqString zurückgegeben, die mit Hilfe eines Konvertierungsoperators in char * umgewandelt werden können. Die Klasse ImqString enthält Methoden, die bei der Verarbeitung von Zeichenketten helfen.
Wenn Zeichendaten mit Hilfe von MQI C++-Methoden akzeptiert oder zurückgegeben werden, sind die Zeichendaten immer mit Null beendet und können beliebig lang sein. Allerdings setzt IBM MQ einige Grenzen, die dazu führen können, dass Informationen abgeschnitten werden. Um die Speicherverwaltung zu vereinfachen, werden Zeichendaten häufig in ImqString-Klassenobjekten zurückgegeben. Sie können diese Objekte mit dem mitgelieferten Konvertierungsoperator in char * umwandeln und sie in vielen Situationen, in denen ein char * erforderlich ist, für schreibgeschützte Zwecke verwenden.
Obwohl Sie C-Funktionen auf char * anwenden können, sind spezielle Methoden der Klasse ImqString vorzuziehen: Der Operator length ( ) ist das Äquivalent zu strlen und storage ( ) gibt den Speicher an, der für die Zeichendaten zugewiesen wird.
Anfangsstatus von Objekten in C++
Alle Objekte haben einen einheitlichen Ausgangszustand, der sich in ihren Attributen widerspiegelt. Die Anfangswerte werden in den Klassenbeschreibungen definiert.
C von C++ verwenden
string.h in einem C++-Programm:extern "C" {
#include <string.h>
}
C++-Notationskonventionen
ImqQueueManager * pmanager ; // Queue manager
ImqQueue * pqueue ; // Message queue
ImqMessage msg ; // Message
char szBuffer[ 100 ]; // Buffer for message data
pmanager = new ImqQueueManager ;
pqueue = new ImqQueue ;
pqueue -> setName( "myreplyq" );
pqueue -> setConnectionReference( pmanager );
msg.useEmptyBuffer( szBuffer, sizeof( szBuffer ) );
if ( pqueue -> get( msg ) ) {
long lDataLength = msg.dataLength( );
...
}
Implizite Operationen in C++
Es können mehrere Operationen implizit genau zu dem Zeitpunkt auftreten, um die Vorbedingungen für eine erfolgreiche Ausführung einer Methode zu erfüllen. Bei diesen impliziten Operationen handelt es sich um Verbinden, Öffnen, erneut Öffnen, Schließen und Trennen. Sie können das implizite Verhalten beim Verbinden und Öffnen mit Hilfe von Klassenattributen steuern.
- Verbinden
- Ein ImqQueueManager wird automatisch für jede Methode verbunden, die zu einem Aufruf der MQI führt (siehe C++ und MQI-Querverweis).
- Offen
- Ein ImqObject-Objekt wird automatisch für Methoden geöffnet, die einen MQGET-, MQINQ-, MQPUT- oder MQSET-Aufruf zur Folge haben. Verwenden Sie die Methode openFor, um einen oder mehrere relevante Werte für Öffnen-Optionen anzugeben.
- Erneut öffnen
Ein ImqObject wird für jede Methode, die zu einem MQGET-, MQINQ-, MQPUT- oder MQSET-Aufruf führt, automatisch neu geöffnet, wenn das Objekt bereits geöffnet ist, die vorhandenen Öffnungsoptionen aber nicht ausreichen, um den MQI-Aufruf erfolgreich durchzuführen. Das Objekt wird vorübergehend geschlossen, indem ein Wert für die temporären Schließoptionen von MQCO_NONE verwendet wird. Verwenden Sie die openFor, um eine relevante offene Option hinzuzufügen.
Erneut öffnen kann unter bestimmten Umständen Probleme verursachen:- Eine temporäre dynamische Warteschlange wird zerstört, wenn sie geschlossen wird, und kann nie wieder geöffnet werden.
- Auf eine Warteschlange, die für exklusive Eingaben geöffnet ist (entweder explizit oder standardmäßig), können während des Schließens und Wiederöffnens auch andere zugreifen.
- Wird eine Warteschlange geschlossen, geht die Position des Anzeigecursors verloren. Diese Situation verhindert nicht das Schließen und erneute Öffnen, sondern verhindert die weitere Verwendung des Cursors, bis MQGMO_BROWSE_FIRST erneut verwendet wird.
- Wenn eine Warteschlange geschlossen wird, geht der Kontext der zuletzt abgerufenen Nachricht verloren.
Wenn einer dieser Umstände auftritt oder absehbar ist, vermeiden Sie ein erneutes Öffnen, indem Sie explizit die passenden Öffnen-Optionen einstellen, bevor ein Objekt (entweder explizit oder implizit) geöffnet wird.
Das explizite Festlegen der Open-Optionen für komplexe Warteschlangensituationen führt zu einer besseren Leistung und vermeidet die Probleme, die mit der Verwendung von Reopen verbunden sind.
- Schließen
- Ein ImqObject wird automatisch zu einem Zeitpunkt geschlossen, bei dem der Objektzustand nicht mehr funktionsfähig ist, beispielsweise wenn eine ImqObject-Verbindungsreferenz beschädigt oder wenn ein ImqObject-Objekt gelöscht wird.
- Verbindung trennen
- Ein ImqQueueManager wird automatisch zu einem Zeitpunkt getrennt, bei dem die Verbindung nicht mehr funktionsfähig ist, beispielsweise wenn eine ImqObject-Verbindungsreferenz beschädigt oder wenn ein ImqQueueManager-Objekt gelöscht wird.
Binärzeichenfolgen und andere Zeichenfolgen in C++
Die ImqString-Klasse umfasst das konventionelle Datenformat char *. Die ImqBinary-Klasse umfasst das binäre Byte-Array. Einige Methoden, die Zeichendaten festlegen, könnten die Daten abschneiden.
Methoden, die Zeichendaten ( char * ) setzen, nehmen immer eine Kopie der Daten, aber einige Methoden können die Kopie abschneiden, weil bestimmte Grenzen durch IBM MQ gesetzt sind.
- Vergleich
- Verkettung
- Kopieren
- Ganzzahl-zu-Text- und Text-zu-Ganzzahl-Konvertierung
- Token-Extraktion (Wort)
- Umsetzung in Großbuchstaben
- Abrechnungstoken (MQBYTE32)
- Verbindungstag (MQBYTE128)
- Korrelations-ID (MQBYTE24)
- Funktionstoken (MQBYTE8)
- Gruppen-ID (MQBYTE24)
- Instanz-ID (MQBYTE24)
- Nachrichten-ID (MQBYTE24)
- Nachrichtentoken (MQBYTE16)
- Transaktionsinstanz-ID (MQBYTE16)
- ImqCICS®BridgeHeader (siehe ImqCICSBridgeHeader C++ Klasse )
- ImqGetMessageOptions (siehe ImqGetMessageOptions C++ Klasse )
- IMS(siehe IMSC++ Klasse )
- ImqMessageTracker (siehe ImqMessageTracker C++ Klasse )
- ImqQueueManager (siehe ImqQueueManager C++ Klasse )
- ImqReferenceHeader (siehe ImqReferenceHeader C++ Klasse )
- ImqWorkHeader (siehe ImqWorkHeader C++ Klasse )
Nicht unterstützte Funktionen in C++
Die IBM MQ C++-Klassen und -Methoden sind unabhängig von der IBM MQ Plattform und bieten daher möglicherweise Funktionen, die auf bestimmten Plattformen nicht unterstützt werden.
Wenn Sie versuchen, eine Funktion auf einer Plattform zu verwenden, auf der sie nicht unterstützt wird, wird die Funktion zwar von IBM MQ erkannt, aber nicht von den C++-Sprachbindungen. IBM MQ meldet den Fehler an Ihr Programm, wie jeden anderen MQI-Fehler.