Ü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

Header-Dateien werden als Teil der MQI-Definition bereitgestellt, um Sie beim Schreiben von IBM® MQ Anwendungsprogrammen in der Sprache C++ zu unterstützen. Diese Headerdateien werden in der folgenden Tabelle zusammengefasst.
Tabelle 1. C/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
Um die Portierbarkeit von Anwendungen zu verbessern, codieren Sie bei der #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++

Zeichenfolgen von Binärdaten werden als Objekte der ImqBinary-Klasse deklariert. Sie können Objekte dieser Klasse mit Hilfe der C-Operatoren kopieren, vergleichen und setzen. Der folgende Beispielcode zeigt Operationen mit einer binären Zeichenfolge:
#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.

Hinweis: Das Ergebnis der char *-Konvertierung aus einem Objekt der Klasse ImqString kann null sein.

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

Wenn Sie C-Funktionen von einem C++-Programm verwenden, beziehen Sie zutreffende Header ein. Der folgende Beispielcode zeigt string.h in einem C++-Programm:
extern "C" {
#include <string.h>
}

C++-Notationskonventionen

Dieses Codebeispiel zeigt, wie man Methoden aufruft und Parameter deklariert. Das Beispiel verwendet die Methoden und Parameter ImqBoolean ImqQueue:: get ( ImqMessage & msg ) . Deklarieren und verwenden Sie die Parameter wie folgt:
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.

Die Klasse ImqString (siehe ImqString C++ Klasse) kapselt das traditionelle char * und bietet Unterstützung für die folgenden Aktionen:
  • Vergleich
  • Verkettung
  • Kopieren
  • Ganzzahl-zu-Text- und Text-zu-Ganzzahl-Konvertierung
  • Token-Extraktion (Wort)
  • Umsetzung in Großbuchstaben
Die Klasse ImqBinary (siehe ImqBinary C++ Klasse) kapselt binäre Byte-Arrays beliebiger Größe. Diese Klasse wird insbesondere zur Aufnahme der folgenden Attribute verwendet:
  • Abrechnungstoken (MQBYTE32)
  • Verbindungstag (MQBYTE128)
  • Korrelations-ID (MQBYTE24)
  • Funktionstoken (MQBYTE8)
  • Gruppen-ID (MQBYTE24)
  • Instanz-ID (MQBYTE24)
  • Nachrichten-ID (MQBYTE24)
  • Nachrichtentoken (MQBYTE16)
  • Transaktionsinstanz-ID (MQBYTE16)
Diese Attribute gehören zu Objekten der folgenden Klassen:Die ImqBinary-Klasse bietet auch Unterstützung für Vergleich und Kopieren.

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.