Opzioni (MQLONG)
- Aggiungere i valori (non aggiungere la stessa costante più di una volta) oppure
- Combinare i valori utilizzando l'operazione OR bitwise (se il linguaggio di programmazione supporta le operazioni bit).
MQGMO_WAIT- L'applicazione attende l'arrivo di un messaggio adatto. Il tempo massimo di attesa dell'applicazione è specificato in
WaitInterval.Importante: non vi è alcuna attesa o ritardo, se un messaggio adatto è disponibile immediatamente.Se le richieste MQGET sono inibite o MQGET diventano inibite durante l'attesa, l'attesa viene annullata. La chiamata viene completata con
MQCC_FAILEDe il codice motivoMQRC_GET_INHIBITED, indipendentemente dal fatto che ci siano messaggi adatti sulla coda.È possibile utilizzare
MQGMO_WAITcon le opzionioMQGMO_BROWSE_FIRSTMQGMO_BROWSE_NEXT.Se diverse applicazioni sono in attesa sulla stessa coda condivisa, le seguenti regole selezionano quale applicazione viene attivata quando arriva un messaggio appropriato:
Se più di una chiamata MQGET senza l'opzione BROWSE è in attesa sulla stessa coda, ne viene attivata solo una. Il gestore code tenta di dare priorità alle chiamate in attesa nel seguente ordine:Tabella 1. Regole per l'attivazione di chiamate MQGET su una coda condivisa Numero di chiamate MQGET in attesa di attivazione Risultato Con un'opzione BROWSE Senza un'opzione BROWSE 1 Nessuna Uno o più Viene attivata una chiamata MQGET senza un'opzione BROWSE . Uno o più Nessuna Tutte le chiamate MQGET con opzione BROWSE vengono attivate. Uno o più Uno o più Viene attivata una chiamata MQGET senza un'opzione BROWSE . Il numero di chiamate MQGET con un'opzione BROWSE attivate è imprevedibile. - Richieste get - wait specifiche che possono essere soddisfatte solo da determinati messaggi, ad esempio, quelli con uno specifico
MsgIdoCorrelId(o entrambi). - Richieste get - wait generali che possono essere soddisfatte da qualsiasi messaggio.
Nota:- All'interno della prima categoria, non viene assegnata alcuna priorità aggiuntiva alle richieste get - wait più specifiche. Ad esempio, richieste che specifichino sia
MsgIdcheCorrelId. - All'interno di entrambe le categorie, non è possibile prevedere quale applicazione è selezionata. In particolare, l'applicazione in attesa più lunga non è necessariamente quella selezionata.
- La lunghezza del percorso e le considerazioni sulla pianificazione della priorità del sistema operativo possono indicare che un'applicazione in attesa con priorità del sistema operativo inferiore a quella prevista richiama il messaggio.
- Può anche accadere che un'applicazione che non è in attesa recuperi il messaggio piuttosto che uno.
In z/OS®, si applicano i punti seguenti:- Se si desidera che l'applicazione proceda con un altro lavoro in attesa dell'arrivo del messaggio, utilizzare invece l'opzione di segnale (
). Tuttavia, l'opzione di segnale è specifica dell'ambiente; le applicazioni da trasferire tra ambienti differenti non devono utilizzarla.MQGMO_SET_SIGNAL - Se c'è più di una chiamata MQGET in attesa dello stesso messaggio, con una combinazione di opzioni di attesa e segnale, ogni chiamata in attesa viene considerata allo stesso modo. È un errore specificare
conMQGMO_SET_SIGNAL. È anche un errore specificare questa opzione con un handle di coda per cui un segnale è in sospeso.MQGMO_WAIT - Se si specifica
oMQGMO_WAITMQGMO_SET_SIGNALper una coda che ha unIndexTypediMQIT_MSG_TOKEN, non è consentito alcun criterio di selezione. Questo vuol dire che:- Se si utilizza una version-1
MQGMO, impostare i campiMsgIdeCorrelIdin MQMD specificato nella chiamata MQGET aMQMI_NONEeMQCI_NONE. - Se si utilizza una version-2 o successiva
MQGMO, impostare il campoMatchOptionssuMQMO_NONE.
- Se si utilizza una version-1
- Per una chiamata MQGET su una coda condivisa e la chiamata è una richiesta di ricerca o una ricezione distruttiva di un messaggio di gruppo e non è necessario che
MsgIdnéCorrelIdcorrispondano, il segnale ECB viene inviato MQEC_MSG_ARRIVED dopo 200 millisecondi.Ciò si verifica, anche se un messaggio adatto potrebbe non essere arrivato sulla coda, fino a quando l'intervallo di attesa non è scaduto, quando la coda viene inviata con MQEC_WAIT_INTERVAL_EXPIRED. Quando viene inviato MQEC_MSG_ARRIVED, è necessario emettere nuovamente una seconda chiamata MQGET per richiamare il messaggio, se disponibile.
Questa tecnica viene utilizzata per garantire che l'utente venga informato in modo tempestivo dell'arrivo di un messaggio, ma può apparire come un sovraccarico di elaborazione imprevisto quando viene confrontato con una sequenza di chiamata simile su una coda non condivisa.
viene ignorato se specificato conMQGMO_WAITMQGMO_BROWSE_MSG_UNDER_CURSORo; non viene generato alcun errore.MQGMO_MSG_UNDER_CURSOR - Richieste get - wait specifiche che possono essere soddisfatte solo da determinati messaggi, ad esempio, quelli con uno specifico
MQGMO_NO_WAIT- L'applicazione non attende se non è disponibile alcun messaggio adatto.
MQGMO_NO_WAITè l'opposto diMQGMO_WAIT.MQGMO_NO_WAITè definito per aiutare la documentazione del programma. È il valore predefinito se non viene specificato nessuno dei due. MQGMO_SET_SIGNAL- Utilizzare questa opzione con i campi
Signal1eSignal2. Consente alle applicazioni di procedere con un altro lavoro in attesa dell'arrivo di un messaggio. Consente inoltre (se sono disponibili funzioni del sistema operativo adatte) alle applicazioni di attendere i messaggi in arrivo su più di una coda.Nota: l'opzioneMQGMO_SET_SIGNALè specifica dell'ambiente; non utilizzarla per le applicazioni che si desidera trasferire.In due circostanze, la chiamata viene completata come se questa opzione non fosse stata specificata:- Se un messaggio attualmente disponibile soddisfa i criteri specificati nel descrittore del messaggio.
- Se viene rilevato un errore di parametro o un altro errore sincrono.
Se nessun messaggio che soddisfa i criteri specificati nel descrittore del messaggio è attualmente disponibile, il controllo ritorna all'applicazione senza attendere l'arrivo di un messaggio. I parametri
CompCodeeReasonsono impostati sueMQCC_WARNINGMQRC_SIGNAL_REQUEST_ACCEPTED. Non vengono impostati altri campi di output nel descrittore del messaggio e i parametri di output della chiamata MQGET . Quando un messaggio appropriato arriva più tardi, il segnale viene inviato inviando la BCE.Il chiamante deve quindi emettere nuovamente la chiamata MQGET per recuperare il messaggio. L'applicazione può attendere questo segnale, utilizzando le funzioni fornite dal sistema operativo.
Se il sistema operativo fornisce un meccanismo di attesa multiplo, è possibile utilizzarlo per attendere l'arrivo di un messaggio su una delle diverse code.
Se viene specificato un
WaitIntervaldiverso da zero, il segnale viene consegnato dopo la scadenza dell'intervallo di attesa. Il Gestore code può anche annullare l'attesa, nel qual caso il segnale viene recapitato.Più di una chiamata MQGET può impostare un segnale per lo stesso messaggio. L'ordine in cui le applicazioni vengono attivate è lo stesso descritto per
MQGMO_WAIT.Se più di una chiamata MQGET è in attesa dello stesso messaggio, ogni chiamata in attesa viene considerata allo stesso modo. Le chiamate possono includere una combinazione di opzioni di attesa e segnale.
In determinate circostanze, la chiamata MQGET può richiamare un messaggio e può essere consegnato un segnale risultante dall'arrivo dello stesso messaggio. Quando un segnale viene consegnato, un'applicazione deve essere preparata per non rendere disponibile alcun messaggio.
Un gestore code non può avere più di una richiesta di segnale in sospeso.
Questa opzione non è valida con nessuna delle seguenti opzioni:MQGMO_UNLOCKMQGMO_WAIT
Per una chiamata MQGET su una coda condivisa e la chiamata è una richiesta di ricerca o un richiamo distruttivo di un messaggio di gruppo, e non è necessario associare né
MsgIdnéCorrelId, il segnale dell'utente ECB viene inviatoMQEC_MSG_ARRIVEDdopo 200 millisecondi.Ciò si verifica, anche se un messaggio adatto potrebbe non essere arrivato sulla coda, fino a quando l'intervallo di attesa non è scaduto, quando la coda viene inviata con
MQEC_WAIT_INTERVAL_EXPIRED. QuandoMQEC_MSG_ARRIVEDviene pubblicato, è necessario emettere nuovamente una seconda chiamata MQGET per richiamare il messaggio, se disponibile.Questa tecnica viene utilizzata per garantire che l'utente venga informato in modo tempestivo dell'arrivo di un messaggio, ma può apparire come un sovraccarico di elaborazione imprevisto quando viene confrontato con una sequenza di chiamata simile su una coda non condivisa.
Questo non è un metodo efficiente di richiamo dei messaggi quando i messaggi vengono aggiunti raramente. Per evitare questo sovraccarico per il caso di esplorazione, specificare
MsgId(se non indicizzato o indicizzato daMsgId) oCorrelId(se indicizzato daCorrelId) corrispondente alla chiamata MQGET .Questa opzione è supportata solo su z/OS .
MQGMO_FAIL_IF_QUIESCING- Forzare l'esito negativo della chiamata MQGET se il gestore code è in stato di inattività.
In z/OS, questa opzione forza anche l'esito negativo della chiamata MQGET se la connessione (per un'applicazione CICS® o IMS ) si trova nello stato di inattività.
Se questa opzione è specificata conMQGMO_WAIToMQGMO_SET_SIGNALe l'attesa o il segnale è in sospeso nel momento in cui il gestore code entra nello stato di sospensione:- L'attesa viene annullata e la chiamata restituisce il codice di completamento
MQCC_FAILEDcon codice motivoMQRC_Q_MGR_QUIESCINGoMQRC_CONNECTION_QUIESCING. - Il segnale viene annullato con un codice di completamento del segnale specifico dell'ambiente.
Su z/OS, il segnale viene completato con il codice di completamento evento
MQEC_Q_MGR_QUIESCINGoMQEC_CONNECTION_QUIESCING.
MQGMO_FAIL_IF_QUIESCINGnon viene specificato e il gestore code o la connessione entra nello stato di sospensione, l'attesa o il segnale non vengono annullati. - L'attesa viene annullata e la chiamata restituisce il codice di completamento
MQGMO_SYNCPOINT- La richiesta è di operare all'interno dei normali protocolli di unità di lavoro. Il messaggio è contrassegnato come non disponibile per altre applicazioni, ma viene eliminato dalla coda solo quando viene eseguito il commit dell'unità di lavoro. Il messaggio viene reso nuovamente disponibile se viene eseguito il backout dell'unità di lavoro.
È possibile lasciare
MQGMO_SYNCPOINTeMQGMO_NO_SYNCPOINTnon impostati. In tal caso, l'inclusione della richiesta get nei protocolli UOW è determinata dall'ambiente che esegue il gestore code. Non è determinato dall'ambiente che esegue l'applicazione. Su z/OS, la richiesta get si trova all'interno di un'unità di lavoro. In tutti gli altri ambienti, la richiesta get non si trova all'interno di un'unità di lavoro.A causa di queste differenze, un'applicazione che si desidera trasferire non deve consentire l'impostazione predefinita di questa opzione; specificare esplicitamente
MQGMO_SYNCPOINToMQGMO_NO_SYNCPOINT.Questa opzione non è valida con nessuna delle seguenti opzioni:MQGMO_BROWSE_FIRSTMQGMO_BROWSE_MSG_UNDER_CURSORMQGMO_BROWSE_NEXTMQGMO_LOCKMQGMO_NO_SYNCPOINTMQGMO_SYNCPOINT_IF_PERSISTENTMQGMO_UNLOCK
MQGMO_SYNCPOINT_IF_PERSISTENT- La richiesta è di operare all'interno dei normali protocolli dell'unità di lavoro, ma solo se il messaggio richiamato è persistente. Un messaggio persistente ha il valore
MQPER_PERSISTENTnel campoPersistencein MQMD.- Se il messaggio è persistente, il gestore code elabora la chiamata come se l'applicazione avesse specificato
MQGMO_SYNCPOINT. - Se il messaggio non è persistente, il gestore code elabora la chiamata come se l'applicazione avesse specificato
MQGMO_NO_SYNCPOINT.
Questa opzione non è valida con nessuna delle seguenti opzioni:MQGMO_BROWSE_FIRSTMQGMO_BROWSE_MSG_UNDER_CURSORMQGMO_BROWSE_NEXTMQGMO_COMPLETE_MSGMQGMO_MARK_SKIP_BACKOUTMQGMO_NO_SYNCPOINTMQGMO_SYNCPOINTMQGMO_UNLOCK
Questa opzione è supportata nei seguenti ambienti: AIX®, HP-UX, z/OS, IBM® i, Solarise Linux®, più IBM MQ MQI clients connessi a questi sistemi.
- Se il messaggio è persistente, il gestore code elabora la chiamata come se l'applicazione avesse specificato
MQGMO_NO_SYNCPOINT- La richiesta è di operare al di fuori dei normali protocolli di unità di lavoro. Se si riceve un messaggio senza un'opzione di ricerca, viene eliminato immediatamente dalla coda. Il messaggio non può essere reso nuovamente disponibile eseguendo il backout dell'unità di lavoro.
Questa opzione viene assunta se si specifica
MQGMO_BROWSE_FIRSToMQGMO_BROWSE_NEXT.È possibile lasciare
MQGMO_SYNCPOINTeMQGMO_NO_SYNCPOINTnon impostati. In tal caso, l'inclusione della richiesta get nei protocolli UOW è determinata dall'ambiente che esegue il gestore code. Non è determinato dall'ambiente che esegue l'applicazione. Su z/OS, la richiesta get si trova all'interno di un'unità di lavoro. In tutti gli altri ambienti, la richiesta get non si trova all'interno di un'unità di lavoro.A causa di queste differenze, un'applicazione che si desidera trasferire non deve consentire l'impostazione predefinita di questa opzione; specificare esplicitamente
MQGMO_SYNCPOINToMQGMO_NO_SYNCPOINT.Questa opzione non è valida con nessuna delle seguenti opzioni:MQGMO_MARK_SKIP_BACKOUTMQGMO_SYNCPOINTMQGMO_SYNCPOINT_IF_PERSISTENT
MQGMO_MARK_SKIP_BACKOUT- Ripristinare un'unità di lavoro senza ripristinare sulla coda il messaggio contrassegnato con questa opzione.
MQGMO_BROWSE_FIRST- Quando una coda viene aperta con l'opzione MQOO_BROWSE, viene stabilito un cursore di ricerca, posizionato logicamente prima del primo messaggio sulla coda. È quindi possibile utilizzare le chiamate MQGET specificando l'opzione
MQGMO_BROWSE_FIRST,MQGMO_BROWSE_NEXToMQGMO_BROWSE_MSG_UNDER_CURSORper richiamare i messaggi dalla coda in modo non distruttivo. Il cursore di esplorazione contrassegna la posizione, all'interno dei messaggi sulla coda, da cui la successiva chiamata MQGET conMQGMO_BROWSE_NEXTricerca un messaggio adatto.MQGMO_BROWSE_FIRSTnon è valido con nessuna delle seguenti opzioni:MQGMO_BROWSE_MSG_UNDER_CURSORMQGMO_BROWSE_NEXTMQGMO_MARK_SKIP_BACKOUTMQGMO_MSG_UNDER_CURSORMQGMO_SYNCPOINTMQGMO_SYNCPOINT_IF_PERSISTENTMQGMO_UNLOCK
Una chiamata MQGET con
MQGMO_BROWSE_FIRSTignora la precedente posizione del cursore di ricerca. Viene richiamato il primo messaggio sulla coda che soddisfa le condizioni specificate nel descrittore del messaggio. Il messaggio rimane nella coda e il cursore di ricerca è posizionato su questo messaggio.Dopo questa chiamata, il cursore di ricerca viene posizionato sul messaggio che è stato restituito. Il messaggio potrebbe essere rimosso dalla coda prima che venga emessa la successiva chiamata MQGET con
MQGMO_BROWSE_NEXT. In questo caso, il cursore di ricerca rimane nella posizione nella coda occupata dal messaggio, anche se tale posizione è ora vuota.Utilizzare l'opzione
MQGMO_MSG_UNDER_CURSORcon una chiamata MQGET non - browse per rimuovere il messaggio dalla coda.Il cursore di ricerca non viene spostato da una chiamata MQGET non di ricerca, anche se si utilizza lo stesso handle
Hobj. Inoltre, non viene spostato da una chiamata MQGET di ricerca che restituisce un codice di completamento diMQCC_FAILEDo un codice motivo diMQRC_TRUNCATED_MSG_FAILED.Specificare l'opzione
MQGMO_LOCKcon questa opzione, per bloccare il messaggio visualizzato.È possibile specificare
MQGMO_BROWSE_FIRSTcon qualsiasi combinazione valida delle opzioniMQGMO_*eMQMO_*che controllano l'elaborazione dei messaggi in gruppi e segmenti di messaggi logici.Se si specifica
MQGMO_LOGICAL_ORDER, i messaggi vengono esaminati in ordine logico. Se si omette tale opzione, i messaggi vengono visualizzati in ordine fisico. Se si specificaMQGMO_BROWSE_FIRST, è possibile passare tra ordine logico e ordine fisico. Le chiamate MQGET successive che utilizzanoMQGMO_BROWSE_NEXTsfogliano la coda nello stesso ordine della chiamata più recente che ha specificatoMQGMO_BROWSE_FIRSTper l'handle di coda.Il gestore code conserva due serie di informazioni di gruppi e segmenti per le chiamate MQGET . Le informazioni sul gruppo e sul segmento per le chiamate di esplorazione vengono conservate separatamente dalle informazioni per le chiamate che rimuovono i messaggi dalla coda. Se si specifica
MQGMO_BROWSE_FIRST, il gestore code ignora le informazioni sul gruppo e sul segmento per la ricerca. Esegue la scansione della coda come se non ci fossero gruppi correnti e messaggi logici correnti. Se la chiamata MQGET ha esito positivo, codice di completamentoMQCC_OKoMQCC_WARNING, le informazioni sul gruppo e sul segmento per la ricerca sono impostate su quelle del messaggio restituito. Se la chiamata ha esito negativo, le informazioni sul gruppo e sul segmento rimangono le stesse che erano prima della chiamata. MQGMO_BROWSE_NEXT- Avanzare il cursore di ricerca al messaggio successivo sulla coda che soddisfa i criteri di selezione specificati nella chiamata MQGET . Il messaggio viene restituito all'applicazione, ma rimane nella coda.
MQGMO_BROWSE_MSG_UNDER_CURSOR- Richiamare il messaggio a cui punta il cursore di esplorazione in modo non distruttivo, indipendentemente dalle opzioni
MQMO_*specificate nel campoMatchOptionsin MQGMO. MQGMO_MSG_UNDER_CURSOR- Richiamare il messaggio a cui punta il cursore di esplorazione, indipendentemente dalle opzioni
MQMO_*specificate nel campoMatchOptionsin MQGMO. Il messaggio viene rimosso dalla coda.Il messaggio puntato dal cursore di ricerca è quello che è stato richiamato per ultimo utilizzando l'opzione
MQGMO_BROWSE_FIRSToMQGMO_BROWSE_NEXT.Se
MQGMO_COMPLETE_MSGviene specificato conMQGMO_MSG_UNDER_CURSOR, il cursore di esplorazione deve identificare un messaggio il cui campoOffsetin MQMD è zero. Se questa condizione non viene soddisfatta, la chiamata ha esito negativo con codice di erroreMQRC_INVALID_MSG_UNDER_CURSOR.Questa opzione non è valida con nessuna delle seguenti opzioni:MQGMO_BROWSE_FIRSTMQGMO_BROWSE_MSG_UNDER_CURSORMQGMO_BROWSE_NEXTMQGMO_UNLOCK
MQGMO_MARK_BROWSE_HANDLE- Il messaggio restituito da un MQGETriuscito o identificato dal
MsgTokenrestituito, viene contrassegnato. Il contrassegno è specifico per l'handle oggetto utilizzato nella chiamata.Il messaggio non viene rimosso dalla coda.
MQGMO_MARK_BROWSE_HANDLEè valido solo se viene specificata anche una delle seguenti opzioni:MQGMO_BROWSE_FIRSTMQGMO_BROWSE_MSG_UNDER_CURSORMQGMO_BROWSE_NEXT
MQGMO_MARK_BROWSE_HANDLEnon è valido con nessuna delle seguenti opzioni:MQGMO_ALL_MSGS_AVAILABLEMQGMO_ALL_SEGMENTS_AVAILABLEMQGMO_COMPLETE_MSGMQGMO_LOCKMQGMO_LOGICAL_ORDERMQGMO_UNLOCK
Il messaggio rimane in questo stato fino a quando non si verifica uno dei seguenti eventi:- L'handle dell'oggetto interessato è chiuso, normalmente o in altro modo.
- Il messaggio non è contrassegnato per questo handle da una chiamata a MQGET con opzione
MQGMO_UNMARK_BROWSE_HANDLE. - Il messaggio viene restituito da una chiamata a MQGETdistruttivo, che viene completata con
MQCC_OKoMQCC_WARNING. Lo stato del messaggio rimane modificato anche se il MQGET viene successivamente sottoposto a rollback. - Il messaggio scade.
MQGMO_MARK_BROWSE_CO_OP- Il messaggio restituito da un MQGETriuscito o identificato dal
MsgTokenrestituito, è contrassegnato per tutti gli handle nella serie cooperante.Il contrassegno di livello cooperativo è in aggiunta a qualsiasi contrassegno di livello handle che potrebbe essere stato impostato.
Il messaggio non viene rimosso dalla coda.
MQGMO_MARK_BROWSE_CO_OPè valido solo se l'handle dell'oggetto utilizzato è stato restituito da una chiamata a MQOPEN che ha specificatoMQOO_CO_OP. È necessario specificare anche una delle seguenti opzioni MQGMO :MQGMO_BROWSE_FIRSTMQGMO_BROWSE_MSG_UNDER_CURSORMQGMO_BROWSE_NEXT
Questa opzione non è valida con nessuna delle seguenti opzioni:MQGMO_ALL_MSGS_AVAILABLEMQGMO_ALL_SEGMENTS_AVAILABLEMQGMO_COMPLETE_MSGMQGMO_LOCKMQGMO_LOGICAL_ORDERMQGMO_UNLOCK
Se il messaggio è già contrassegnato e l'opzione
MQGMO_UNMARKED_BROWSE_MSGnon è specificata, la chiamata ha esito negativo conMQCC_FAILEDe codice motivoMQRC_MSG_MARKED_BROWSE_CO_OP.Il messaggio rimane in questo stato fino a quando non si verifica uno dei seguenti eventi:- Tutte le maniglie dell'oggetto nella serie cooperante sono chiuse.
- Il messaggio non è contrassegnato per i browser cooperanti da una chiamata a MQGET con l'opzione
MQGMO_UNMARK_BROWSE_CO_OP. - Il messaggio viene automaticamente annullato dal gestore code.
- Il messaggio viene restituito da una chiamata a un MQGETnon - browse. Lo stato del messaggio rimane modificato anche se il MQGET viene successivamente sottoposto a rollback.
- Il messaggio scade.
MQGMO_UNMARKED_BROWSE_MSG- Una chiamata a MQGET che specifica
MQGMO_UNMARKED_BROWSE_MSGrestituisce un messaggio che viene considerato non contrassegnato per il relativo handle. Non restituisce un messaggio se il messaggio è stato contrassegnato per la sua gestione. Inoltre, non restituisce il messaggio se la coda è stata aperta da una chiamata a MQOPEN, con l'opzioneMQOO_CO_OP, e il messaggio è stato contrassegnato da un membro della serie cooperante.Questa opzione non è valida con nessuna delle seguenti opzioni:MQGMO_ALL_MSGS_AVAILABLEMQGMO_ALL_SEGMENTS_AVAILABLEMQGMO_COMPLETE_MSGMQGMO_LOCKMQGMO_LOGICAL_ORDERMQGMO_UNLOCK
MQGMO_UNMARK_BROWSE_CO_OP- Dopo una chiamata a MQGET che specifica questa opzione, il messaggio non viene più considerato da alcun handle aperto nella serie di handle cooperanti da contrassegnare per la serie cooperante. Il messaggio viene ancora considerato come contrassegnato a livello di gestione se è stato contrassegnato a livello di gestione prima di questa chiamata.
L'uso di
MQGMO_UNMARK_BROWSE_CO_OPè valido solo con un handle restituito da una chiamata riuscita a MQOPEN con opzioneMQOO_CO_OP. Il MQGET ha esito positivo anche se il messaggio non è considerato contrassegnato dalla serie di handle cooperante.MQGMO_UNMARK_BROWSE_CO_OPnon è valido su una chiamata MQGET non di ricerca o con una delle seguenti opzioni:MQGMO_ALL_MSGS_AVAILABLEMQGMO_ALL_SEGMENTS_AVAILABLEMQGMO_COMPLETE_MSGMQGMO_LOCKMQGMO_LOGICAL_ORDERMQGMO_MARK_BROWSE_CO_OPMQGMO_UNLOCKMQGMO_UNMARKED_BROWSE_MSG
MQGMO_UNMARK_BROWSE_HANDLE- Dopo una chiamata a MQGET che specifica questa opzione, il messaggio individuato non viene più considerato contrassegnato da questo handle.
La chiamata ha esito positivo anche se il messaggio non è contrassegnato per questo handle.
Questa opzione non è valida su una chiamata MQGET non di ricerca o con una delle seguenti opzioni:MQGMO_ALL_MSGS_AVAILABLEMQGMO_ALL_SEGMENTS_AVAILABLEMQGMO_COMPLETE_MSGMQGMO_LOCKMQGMO_LOGICAL_ORDERMQGMO_MARK_BROWSE_CO_OPMQGMO_UNLOCKMQGMO_UNMARKED_BROWSE_MSG
MQGMO_LOCK- Bloccare il messaggio che viene esplorato, in modo che il messaggio diventi invisibile a qualsiasi altro handle aperto per la coda. L'opzione può essere specificata solo se viene specificata anche una delle seguenti opzioni:
MQGMO_BROWSE_FIRSTMQGMO_BROWSE_NEXTMQGMO_BROWSE_MSG_UNDER_CURSOR
Solo un messaggio può essere bloccato per ogni handle di coda. Il messaggio può essere un messaggio logico o un messaggio fisico:- Se si specifica
MQGMO_COMPLETE_MSG, tutti i segmenti di messaggio che costituiscono il messaggio logico vengono bloccati nell'handle della coda. I messaggi devono essere tutti presenti nella coda e disponibili per il recupero. - Se si omette
MQGMO_COMPLETE_MSG, solo un singolo messaggio fisico viene bloccato all'handle della coda. Se questo messaggio è un segmento di un messaggio logico, il segmento bloccato impedisce ad altre applicazioni di utilizzareMQGMO_COMPLETE_MSGper richiamare o sfogliare il messaggio logico.
Il messaggio bloccato è sempre quello sotto il cursore di ricerca. Il messaggio può essere rimosso dalla coda da una chiamata MQGET successiva che specifica l'opzione
MQGMO_MSG_UNDER_CURSOR. Anche altre chiamate MQGET che utilizzano l'handle della coda possono rimuovere il messaggio (ad esempio, una chiamata che specifica l'identificativo del messaggio bloccato).Se la chiamata restituisce il codice di completamento
MQCC_FAILEDoMQCC_WARNINGcon codice motivoMQRC_TRUNCATED_MSG_FAILED, non viene bloccato alcun messaggio.Se l'applicazione non rimuove il messaggio dalla coda, il blocco viene rilasciato da una delle seguenti azioni:- Emettere un'altra chiamata MQGET per questo handle, specificando
MQGMO_BROWSE_FIRSToMQGMO_BROWSE_NEXT. Il blocco viene rilasciato se la chiamata viene completata conMQCC_OKoMQCC_WARNING. Il messaggio rimane bloccato se la chiamata viene completata conMQCC_FAILED. Tuttavia, si applicano le seguenti eccezioni:- Il messaggio non viene sbloccato se
MQCC_WARNINGviene restituito conMQRC_TRUNCATED_MSG_FAILED. - Il messaggio viene sbloccato se
MQCC_FAILEDviene restituito conMQRC_NO_MSG_AVAILABLE.
Se si specifica anche
MQGMO_LOCK, il messaggio restituito è bloccato. Se si ometteMQGMO_LOCK, non vi è alcun messaggio bloccato dopo la chiamata.Se si specifica
MQGMO_WAITe non è immediatamente disponibile alcun messaggio, il messaggio originale viene sbloccato prima dell'inizio dell'attesa. - Il messaggio non viene sbloccato se
- Esecuzione di un'altra chiamata MQGET per questo handle, con
MQGMO_BROWSE_MSG_UNDER_CURSOR, senzaMQGMO_LOCK. Il blocco viene rilasciato se la chiamata viene completata conMQCC_OKoMQCC_WARNING. Il messaggio rimane bloccato se la chiamata viene completata conMQCC_FAILED. Tuttavia, si applica la seguente eccezione:- Il messaggio non viene sbloccato se
MQCC_WARNINGviene restituito conMQRC_TRUNCATED_MSG_FAILED.
- Il messaggio non viene sbloccato se
- Emissione di un'altra chiamata MQGET per questo handle con
MQGMO_UNLOCK. - Esecuzione di una chiamata MQCLOSE utilizzando l'handle. MQCLOSE potrebbe essere implicito, causato dalla chiusura dell'applicazione.
MQGMO_LOCK, diversa daMQOO_BROWSE, che è necessaria per specificare un'opzione di ricerca di accompagnamento.MQGMO_LOCKnon è valido con nessuna delle seguenti opzioni:MQGMO_MARK_SKIP_BACKOUTMQGMO_SYNCPOINTMQGMO_SYNCPOINT_IF_PERSISTENTMQGMO_UNLOCK
MQGMO_LOCKnon è possibile quando si utilizza un IBM MQ client su HP Integrity NonStop Server in un gestore code z/OS quando è coordinato da TMF. MQGMO_UNLOCK- Il messaggio da sbloccare deve essere stato precedentemente bloccato da una chiamata MQGET con l'opzione
MQGMO_LOCK. Se non è presente alcun messaggio bloccato per questo handle, la chiamata viene completata conMQCC_WARNINGeMQRC_NO_MSG_LOCKED.I parametri
MsgDesc,BufferLength,BuffereDataLengthnon vengono controllati o modificati se si specificaMQGMO_UNLOCK. Nessun messaggio viene restituito inBuffer.Non è richiesta alcuna opzione di apertura speciale per specificare
MQGMO_UNLOCK(anche seMQOO_BROWSEè necessario per emettere la richiesta di blocco in primo luogo).Questa opzione non è valida con le opzioni tranne le seguenti:MQGMO_NO_WAITMQGMO_NO_SYNCPOINT
MQGMO_ACCEPT_TRUNCATED_MSG- Se il buffer di messaggi è troppo piccolo per contenere il messaggio completo, consentire alla chiamata MQGET di riempire il buffer. MQGET riempie il buffer con il maggior numero di messaggi possibile. Emette un codice di completamento di avvertenza e completa la sua elaborazione. Questo vuol dire che:
- Quando si sfogliano i messaggi, il cursore di esplorazione viene avanzato al messaggio restituito.
- Quando si rimuovono i messaggi, il messaggio restituito viene rimosso dalla coda.
- Se non si verifica alcun altro errore, viene restituito il codice motivo MQRC_TRUNCATED_MSG_ACCEPTED.
- Quando si sfogliano i messaggi, il cursore di esplorazione non è avanzato.
- Quando si rimuovono i messaggi, il messaggio non viene rimosso dalla coda.
- Se non si verifica alcun altro errore, viene restituito il codice di errore
MQRC_TRUNCATED_MSG_FAILED.
MQGMO_CONVERT- Questa opzione converte i dati dell'applicazione nel messaggio in modo che siano conformi ai valori
CodedCharSetIdeEncodingspecificati nel parametroMsgDescnella chiamata MQGET . I dati vengono convertiti prima di essere copiati sul parametroBuffer.Il campoFormatspecificato quando il messaggio è stato inserito viene assunto dal processo di conversione per identificare la natura dei dati nel messaggio. I dati del messaggio vengono convertiti dal gestore code per i formati integrati e da un'uscita scritta dall'utente per altri formati. Consultare Uscita conversione dati per i dettagli dell'uscita conversione dati.- Se la conversione ha esito positivo, i campi
CodedCharSetIdeEncodingspecificati nel parametroMsgDescnon vengono modificati al ritorno dalla chiamata MQGET . - Se solo la conversione non riesce, i dati del messaggio vengono restituiti non convertiti. I campi
CodedCharSetIdeEncodinginMsgDescsono impostati sui valori per il messaggio non convertito. Il codice di completamento èMQCC_WARNINGin questo caso.
Buffer.Consultare il campo
Formatdescritto in MQMD - Descrittore messaggi per un elenco di nomi formato per cui il gestore code esegue la conversione. - Se la conversione ha esito positivo, i campi
- Messaggio fisico
- Un messaggio fisico è l'unità di informazioni più piccola che può essere inserita o rimossa da una coda. Spesso corrisponde alle informazioni specificate o richiamate in una singola chiamata MQPUT, MQPUT1o MQGET . Ogni messaggio fisico ha il proprio descrittori di messaggi, MQMD. Generalmente, i messaggi fisici vengono distinti da valori differenti per l'identificativo del messaggio, il campo
MsgIdin MQMD. Il gestore code non applica valori diversi. - Messaggio logico
- Un messaggio logico è una singola unità di informazioni sull'applicazione. In assenza di vincoli di sistema, un messaggio logico è uguale a un messaggio fisico. Se i messaggi logici sono grandi, i vincoli di sistema potrebbero rendere consigliabile o necessario suddividere un messaggio logico in due o più messaggi fisici, denominati segmenti.
Un messaggio logico che è stato segmentato è costituito da due o più messaggi fisici che hanno lo stesso identificativo di gruppo non null, campo
GroupIdin MQMD. Hanno lo stesso numero di sequenza del messaggio, campoMsgSeqNumberin MQMD. I segmenti sono distinti da valori differenti per l'offset del segmento, campoOffsetin MQMD. L'offset del segmento è l'offset dei dati nel messaggio fisico dall'inizio dei dati nel messaggio logico. Poiché ogni segmento è un messaggio fisico, i segmenti in un messaggio logico di solito hanno identificativi di messaggio differenti.Un messaggio logico che non è stato segmentato, ma per cui la segmentazione è stata consentita dall'applicazione di invio, ha anche un identificativo di gruppo non null. In questo caso, esiste un solo messaggio fisico con tale identificativo di gruppo se il messaggio logico non appartiene a un gruppo di messaggi. I messaggi logici, per i quali la segmentazione è stata inibita dall'applicazione di invio, hanno un identificativo di gruppo null,
MQGI_NONE, a meno che il messaggio logico non appartenga a un gruppo di messaggi. - Gruppo di messaggi
- Un gruppo di messaggi è una serie di uno o più messaggi logici che hanno lo stesso identificativo di gruppo non null. I messaggi logici nel gruppo sono distinti da valori differenti per il numero di sequenza del messaggio. Il numero di sequenza è un numero intero compreso tra 1 e n, dove n è il numero di messaggi logici nel gruppo. Se uno o più messaggi logici sono segmentati, nel gruppo sono presenti più di n messaggi fisici.
MQGMO_LOGICAL_ORDERMQGMO_LOGICAL_ORDERcontrolla l'ordine in cui i messaggi vengono restituiti dalle chiamate MQGET successive per l'handle della coda. L'opzione deve essere specificata su ogni chiamata.Se
MQGMO_LOGICAL_ORDERviene specificato per le chiamate MQGET successive per lo stesso handle della coda, i messaggi nei gruppi vengono restituiti nell'ordine dei relativi numeri di sequenza dei messaggi. I segmenti dei messaggi logici vengono restituiti nell'ordine fornito dagli offset dei segmenti. Questo ordine potrebbe essere diverso dall'ordine in cui tali messaggi e segmenti si verificano nella coda.Nota: la specifica diMQGMO_LOGICAL_ORDERnon ha conseguenze negative sui messaggi che non appartengono a gruppi e che non sono segmenti. In effetti, tali messaggi vengono trattati come se ciascuno appartenesse a un gruppo di messaggi costituito da un solo messaggio. È sicuro specificareMQGMO_LOGICAL_ORDERquando si richiamano i messaggi dalle code che contengono una combinazione di messaggi in gruppi, segmenti di messaggi e messaggi non segmentati non in gruppi.Per restituire i messaggi nell'ordine richiesto, il gestore code conserva le informazioni sul gruppo e sul segmento tra le chiamate MQGET successive. Le informazioni sul gruppo e sul segmento identificano il gruppo di messaggi corrente e il messaggio logico corrente per l'handle della coda. Identifica inoltre la posizione corrente all'interno del gruppo e del messaggio logico e se i messaggi vengono richiamati all'interno di un'unità di lavoro. Poiché il gestore code conserva queste informazioni, l'applicazione non deve impostare le informazioni sul gruppo e sul segmento prima di ogni chiamata MQGET . In particolare, significa che l'applicazione non deve impostare i campi
GroupId,MsgSeqNumbereOffsetin MQMD. Tuttavia, l'applicazione deve impostare correttamente l'opzioneMQGMO_SYNCPOINToMQGMO_NO_SYNCPOINTsu ogni chiamata.Quando la coda viene aperta, non esiste alcun gruppo di messaggi corrente e nessun messaggio logico corrente. Un gruppo di messaggi diventa il gruppo di messaggi corrente quando un messaggio con l'indicatoreMQMF_MSG_IN_GROUPviene restituito dalla chiamata MQGET . ConMQGMO_LOGICAL_ORDERspecificato su chiamate successive, quel gruppo rimane il gruppo corrente fino a quando non viene restituito un messaggio che ha:MQMF_LAST_MSG_IN_GROUPsenzaMQMF_SEGMENT(vale a dire, l'ultimo messaggio logico nel gruppo non è segmentato) oppureMQMF_LAST_MSG_IN_GROUPconMQMF_LAST_SEGMENT(ossia, il messaggio restituito è l'ultimo segmento dell'ultimo messaggio logico del gruppo).
MQMF_SEGMENTviene restituito dalla chiamata MQGET . Il messaggio logico viene terminato quando viene restituito il messaggio con l'indicatoreMQMF_LAST_SEGMENT.Se non viene specificato alcun criterio di selezione, le chiamate MQGET successive restituiscono, nell'ordine corretto, i messaggi per il primo gruppo di messaggi sulla coda. Restituiscono quindi i messaggi per il secondo gruppo di messaggi e così via, fino a quando non sono disponibili ulteriori messaggi. È possibile selezionare i gruppi di messaggi particolari restituiti specificando una o più delle seguenti opzioni nel campoMatchOptions:MQMO_MATCH_MSG_IDMQMO_MATCH_CORREL_IDMQMO_MATCH_GROUP_ID
MatchOptionsdescritto in MQGMO - Get - message options per ulteriori dettagli.La Tabella 2 mostra i valori dei campiMsgId,CorrelId,GroupId,MsgSeqNumbereOffsetche il gestore code cerca quando tenta di trovare un messaggio da restituire alla chiamata MQGET . Le regole si applicano sia alla rimozione dei messaggi dalla coda che alla visualizzazione dei messaggi sulla coda. Nella tabella, indica Sì o No:-
LOG ORD - Indica se l'opzione
MQGMO_LOGICAL_ORDERè specificata nella chiamata. -
Cur grp - Indica se esiste un gruppo di messaggi corrente prima della chiamata.
-
Cur log msg - Indica se esiste un messaggio logico corrente prima della chiamata.
- Altre colonne
- Mostra i valori che il gestore code cerca. Precedente indica il valore restituito per il campo nel messaggio precedente per la gestione della coda.
Tabella 2. Opzioni MQGET relative ai messaggi in gruppi e segmenti di messaggi logici Opzioni specificate Stato messaggio di log e gruppo prima della chiamata Valori che il gestore code cerca LOG ORDCur grpCur log msgMsgIdCorrelIdGroupIdMsgSeqNumberOffsetSì No No Controllato da MatchOptionsControllato da MatchOptionsControllato da MatchOptions1 0 Sì No Sì Qualsiasi identificativo di messaggio Qualsiasi identificativo di correlazione Identificativo gruppo precedente 1 Offset precedente + lunghezza segmento precedente Sì Sì No Qualsiasi identificativo di messaggio Qualsiasi identificativo di correlazione Identificativo gruppo precedente Numero di sequenza precedente + 1 0 Sì Sì Sì Qualsiasi identificativo di messaggio Qualsiasi identificativo di correlazione Identificativo gruppo precedente Numero sequenza precedente Offset precedente + lunghezza segmento precedente No Entrambi Entrambi Controllato da MatchOptionsControllato da MatchOptionsControllato da MatchOptionsControllato da MatchOptionsControllato da MatchOptionsSe sulla coda sono presenti più gruppi di messaggi idonei per la restituzione, i gruppi vengono restituiti nell'ordine determinato dalla posizione sulla coda del primo segmento del primo messaggio logico in ciascun gruppo. Vale a dire, i messaggi fisici che hanno un numero di sequenza di messaggi pari a 1 e gli offset pari a 0, determinano l'ordine in cui vengono restituiti i gruppi idonei.
L'opzioneMQGMO_LOGICAL_ORDERinfluisce sulle unità di lavoro nel modo seguente:- Se il primo messaggio logico o segmento in un gruppo viene richiamato all'interno di un'unità di lavoro, tutti gli altri messaggi logici e segmenti nel gruppo devono essere richiamati all'interno di un'unità di lavoro, se viene utilizzato lo stesso handle di coda. Tuttavia, non è necessario recuperarli all'interno della stessa unità di lavoro. Ciò consente a un gruppo di messaggi costituito da molti messaggi fisici di essere suddiviso in due o più unità di lavoro consecutive per la gestione della coda.
- Se il primo messaggio logico o segmento in un gruppo non viene richiamato all'interno di un'unità di lavoro e viene utilizzato lo stesso handle della coda, nessuno degli altri messaggi logici e segmenti nel gruppo può essere richiamato all'interno di un'unità di lavoro.
MQRC_INCONSISTENT_UOW.Quando si specifica
MQGMO_LOGICAL_ORDER, l' MQGMO fornito nella chiamata MQGET non deve essere minore diMQGMO_VERSION_2e l' MQMD non deve essere minore diMQMD_VERSION_2. Se questa condizione non viene soddisfatta, la chiamata ha esito negativo con il codice di erroreMQRC_WRONG_GMO_VERSIONoMQRC_WRONG_MD_VERSION, come appropriato.Se
MQGMO_LOGICAL_ORDERnon è specificato per chiamate successive MQGET per l'handle della coda, i messaggi vengono restituiti indipendentemente dal fatto che appartengano a gruppi di messaggi o se siano segmenti di messaggi logici. Ciò significa che i messaggi o i segmenti di un particolare gruppo o messaggio logico potrebbero essere restituiti fuori ordine o mescolati con messaggi o segmenti di altri gruppi o messaggi logici o con messaggi che non sono in gruppi e non sono segmenti. In questa situazione, i messaggi particolari restituiti da chiamate MQGET successive sono controllati dalle opzioniMQMO_*specificate su tali chiamate (per i dettagli su queste opzioni, consultare il campoMatchOptionsdescritto in MQGMO - Get - message options ).Questa è la tecnica che può essere utilizzata per riavviare un gruppo di messaggi o un messaggio logico nel mezzo, dopo che si è verificato un errore di sistema. Quando il sistema viene riavviato, l'applicazione può impostare i campi
GroupId,MsgSeqNumber,OffseteMatchOptionssui valori appropriati, quindi emettere la chiamata MQGET conMQGMO_SYNCPOINToMQGMO_NO_SYNCPOINTimpostati, ma senza specificareMQGMO_LOGICAL_ORDER. Se questa chiamata ha esito positivo, il gestore code conserva le informazioni sul gruppo e sul segmento e le successive chiamate MQGET che utilizzano tale handle di coda possono specificareMQGMO_LOGICAL_ORDERcome normale.Le informazioni sul segmento e sul gruppo che il gestore code conserva per la chiamata MQGET sono separate dalle informazioni sul gruppo e sul segmento che conserva per la chiamata MQPUT. Inoltre, il gestore code conserva informazioni separate per:- Chiamate MQGET che rimuovono i messaggi dalla coda.
- MQGET chiamate che sfogliano i messaggi sulla coda.
Per qualsiasi handle di coda fornito, l'applicazione può combinare chiamate MQGET che specificanoMQGMO_LOGICAL_ORDERcon chiamate MQGET che non lo fanno. Tuttavia, notare i seguenti punti:- Se si omette
MQGMO_LOGICAL_ORDER, ogni chiamata MQGET eseguita con esito positivo fa sì che il gestore code imposti le informazioni sul gruppo e sul segmento salvate sui valori corrispondenti al messaggio restituito; ciò sostituisce le informazioni sul gruppo e sul segmento esistenti conservate dal gestore code per l'handle della coda. Vengono modificate solo le informazioni appropriate all'azione della chiamata (sfoglia o rimuovi). - Se si omette
MQGMO_LOGICAL_ORDER, la chiamata non avrà esito negativo se è presente un gruppo di messaggi corrente o un messaggio logico; la chiamata potrebbe avere esito positivo con un codice di completamentoMQCC_WARNING. La Tabella 3 mostra i vari casi che possono verificarsi. In questi casi, se il codice di completamento non èMQCC_OK, il codice di errore è uno dei seguenti (come appropriato):MQRC_INCOMPLETE_GROUPMQRC_INCOMPLETE_MSGMQRC_INCONSISTENT_UOW
Nota: il gestore code non verifica le informazioni sul gruppo e sul segmento durante l'esplorazione di una coda o durante la chiusura di una coda aperta per l'esplorazione ma non per l'immissione; in questi casi il codice di completamento è sempreMQCC_OK(supponendo che non vi siano altri errori).
Tabella 3. Risultato quando la chiamata MQGET o MQCLOSE non è congruente con le informazioni su gruppi e segmenti La chiamata corrente è La chiamata precedente era MQGET con MQGMO_LOGICAL_ORDERLa chiamata precedente era MQGET senza MQGMO_LOGICAL_ORDERMQGET con MQGMO_LOGICAL_ORDERMQCC_FAILEDMQCC_FAILEDMQGET senza MQGMO_LOGICAL_ORDERMQCC_WARNINGMQCC_OKMQCLOSE con un gruppo non terminato o un messaggio logico MQCC_WARNINGMQCC_OKLe applicazioni che desiderano richiamare i messaggi e i segmenti in ordine logico sono consigliabili per specificare
MQGMO_LOGICAL_ORDER, poiché questa è l'opzione più semplice da utilizzare. Questa opzione allevia l'applicazione della necessità di gestire le informazioni sul gruppo e sul segmento, poiché il gestore code gestisce tali informazioni. Tuttavia, le applicazioni specializzate potrebbero richiedere un controllo maggiore rispetto a quello fornito dall'opzioneMQGMO_LOGICAL_ORDERe ciò può essere ottenuto non specificando tale opzione. L'applicazione deve quindi verificare che i campiMsgId,CorrelId,GroupId,MsgSeqNumbereOffsetin MQMDe le opzioniMQMO_*inMatchOptionsin MQGMOsiano impostati correttamente, prima di ogni chiamata MQGET .Ad esempio, un'applicazione che desidera inoltrare i messaggi fisici che riceve, indipendentemente dal fatto che tali messaggi si trovino in gruppi o segmenti di messaggi logici, non deve specificare
MQGMO_LOGICAL_ORDER. In una rete complessa con più percorsi tra i gestori code di invio e di ricezione, i messaggi fisici potrebbero arrivare fuori ordine. Specificando néMQGMO_LOGICAL_ORDER, né ilMQPMO_LOGICAL_ORDERcorrispondente nella chiamata MQPUT, l'applicazione di inoltro può recuperare e inoltrare ogni messaggio fisico non appena arriva, senza dover attendere il successivo in ordine logico.È possibile specificareMQGMO_LOGICAL_ORDERcon una qualsiasi delle altre opzioniMQGMO_*e con varie opzioniMQMO_*nelle circostanze appropriate (vedere la sezione precedente).- Su z/OS, questa opzione è supportata per code private e condivise, ma la coda deve avere un tipo di indice
MQIT_GROUP_ID. Per le code condivise, l'oggetto CFSTRUCT a cui è associata la coda deve essere a CFLEVEL (3) o superiore. - Su AIX, HP-UX, IBM i, Solaris, Linux, Windows, più IBM MQ MQI clients connessi a tali sistemi, questa opzione è supportata per tutte le code locali.
MQGMO_COMPLETE_MSG- La chiamata MQGET può restituire solo un messaggio logico completo. Se il messaggio logico è segmentato, il gestore code riassembla i segmenti e restituisce il messaggio logico completo all'applicazione; il fatto che il messaggio logico sia stato segmentato non è evidente per l'applicazione che lo richiama.Nota: questa è l'unica opzione che consente al gestore code di riassemblare i segmenti di messaggi. Se non viene specificato, i segmenti vengono restituiti singolarmente all'applicazione se sono presenti nella coda (e soddisfano gli altri criteri di selezione specificati nella chiamata MQGET ). Le applicazioni che non desiderano ricevere singoli segmenti devono specificare sempre
MQGMO_COMPLETE_MSG.Per utilizzare questa opzione, l'applicazione deve fornire un buffer abbastanza grande da contenere il messaggio completo oppure specificare l'opzione
MQGMO_ACCEPT_TRUNCATED_MSG.Se la coda contiene messaggi segmentati con alcuni dei segmenti mancanti (forse perché sono stati ritardati nella rete e non sono ancora arrivati), specificando
MQGMO_COMPLETE_MSGsi impedisce il richiamo dei segmenti appartenenti a messaggi logici incompleti. Tuttavia, tali segmenti di messaggi contribuiscono ancora al valore dell'attributo della codaCurrentQDepth; ciò significa che potrebbero non essere presenti messaggi logici richiamabili, anche seCurrentQDepthè maggiore di zero.Per i messaggi permanenti , il gestore code può riassemblare i segmenti solo all'interno di un'unità di lavoro:- Se la chiamata MQGET sta operando all'interno di un'unità di lavoro definita dall'utente, viene utilizzata tale unità di lavoro. Se la chiamata non riesce durante il processo di riassemblaggio, il gestore code reinstalla sulla coda tutti i segmenti che sono stati rimossi durante il riassemblaggio. Tuttavia, l'errore non impedisce il corretto commit dell'unità di lavoro.
- Se la chiamata opera al di fuori di un'unità di lavoro definita dall'utente e non esiste alcuna unità di lavoro definita dall'utente, il gestore code crea un'unità di lavoro per la durata della chiamata. Se la chiamata ha esito positivo, il gestore code esegue automaticamente il commit dell'unità di lavoro (non è necessario che l'applicazione esegua questa operazione). Se la chiamata ha esito negativo, il gestore code esegue il backout dell'unità di lavoro.
- Se la chiamata opera all'esterno di un'unità di lavoro definita dall'utente, ma esiste un'unità di lavoro definita dall'utente, il gestore code non può riassemblare. Se il messaggio non richiede il riassemblaggio, la chiamata può ancora avere esito positivo. Ma se il messaggio richiede il riassemblaggio, la chiamata ha esito negativo con codice di errore
MQRC_UOW_NOT_AVAILABLE.
Per i messaggi non persistenti , il gestore code non richiede un'unità di lavoro disponibile per eseguire il riassemblaggio.
Ogni messaggio fisico che è un segmento ha il proprio descrittore di messaggi. Per i segmenti che costituiscono un singolo messaggio logico, la maggior parte dei campi nel descrittore del messaggio sono gli stessi per tutti i segmenti nel messaggio logico; di solito sono solo i campi
MsgId,OffseteMsgFlagsche differiscono tra i segmenti nel messaggio logico. Tuttavia, se un segmento viene posizionato su una coda di messaggi non recapitabili in un gestore code intermedio, il gestore DLQ richiama il messaggio specificando l'opzioneMQGMO_CONVERTe ciò può causare la modifica della serie di caratteri o della codifica del segmento. Se il gestore DLQ invia correttamente il segmento nel suo percorso, il segmento potrebbe avere una serie di caratteri o una codifica diversa dagli altri segmenti nel messaggio logico quando il segmento arriva al gestore code di destinazione.Un messaggio logico costituito da segmenti in cui i campi di
CodedCharSetIdeEncodingdifferiscono non può essere riassemblato dal gestore code in un singolo messaggio logico. Invece, il gestore code riassembla e restituisce i primi segmenti consecutivi all'inizio del messaggio logico che hanno gli stessi identificativi e codifiche della serie di caratteri e la chiamata MQGET viene completata con il codice di completamentoMQCC_WARNINGe il codice motivoMQRC_INCONSISTENT_CCSIDSoMQRC_INCONSISTENT_ENCODINGS, come appropriato. Ciò si verifica indipendentemente dal fatto cheMQGMO_CONVERTsia specificato o meno. Per richiamare i rimanenti segmenti, l'applicazione deve emettere nuovamente la chiamata MQGET senza l'opzioneMQGMO_COMPLETE_MSG, richiamando i segmenti uno alla volta.MQGMO_LOGICAL_ORDERpuò essere utilizzato per richiamare i rimanenti segmenti in ordine.Un'applicazione che inserisce segmenti può anche impostare altri campi nel descrittore del messaggio su valori che differiscono tra i segmenti. Tuttavia, non vi è alcun vantaggio se l'applicazione ricevente utilizza
MQGMO_COMPLETE_MSGper richiamare il messaggio logico. Quando il gestore code riassembla un messaggio logico, restituisce nel descrittore del messaggio i valori del descrittore del messaggio per il primo segmento; l'unica eccezione è il campoMsgFlags, impostato dal gestore code per indicare che il messaggio riassemblato è l'unico segmento.Se
MQGMO_COMPLETE_MSGè specificato per un messaggio di report, il gestore code esegue un'elaborazione speciale. Il gestore code controlla la coda per vedere se tutti i messaggi di report di quel tipo relativi ai diversi segmenti nel messaggio logico sono presenti nella coda. Se lo sono, possono essere richiamati come un singolo messaggio specificandoMQGMO_COMPLETE_MSG. Affinché ciò sia possibile, i messaggi di report devono essere generati da un gestore code o da un MCA che supporta la segmentazione oppure l'applicazione di origine deve richiedere almeno 100 byte di dati del messaggio (ovvero, è necessario specificare le opzioniMQRO_*_WITH_DATAoMQRO_*_WITH_FULL_DATAappropriate). Se per un segmento è presente meno dell'intera quantità di dati dell'applicazione, i byte mancanti vengono sostituiti da valori null nel messaggio di report restituito.Se
MQGMO_COMPLETE_MSGviene specificato conMQGMO_MSG_UNDER_CURSORoMQGMO_BROWSE_MSG_UNDER_CURSOR, il cursore di esplorazione deve essere posizionato su un messaggio il cui campoOffsetin MQMD ha un valore pari a 0. Se questa condizione non viene soddisfatta, la chiamata ha esito negativo con codice di erroreMQRC_INVALID_MSG_UNDER_CURSOR.MQGMO_COMPLETE_MSGimplicaMQGMO_ALL_SEGMENTS_AVAILABLE, che quindi non deve essere specificato.MQGMO_COMPLETE_MSGpuò essere specificato con qualsiasi altra opzioneMQGMO_*ad eccezione diMQGMO_SYNCPOINT_IF_PERSISTENTe con qualsiasi altra opzioneMQMO_*ad eccezione di MQMO_MATCH_OFFSET.- Su z/OS, questa opzione è supportata per code private e condivise, ma la coda deve avere un tipo di indice MQIT_GROUP_ID. Per le code condivise, l'oggetto CFSTRUCT a cui è associata la coda deve essere a CFLEVEL (3) o superiore.
- Su AIX, HP-UX, IBM i, Solaris, Linux, Windows, più IBM MQ MQI clients connessi a tali sistemi, questa opzione è supportata per tutte le code locali.
MQGMO_ALL_MSGS_AVAILABLE- I messaggi in un gruppo diventano disponibili per il richiamo solo quando tutti i messaggi nel gruppo sono disponibili. Se la coda contiene gruppi di messaggi con alcuni dei messaggi mancanti (forse perché sono stati ritardati nella rete e non sono ancora arrivati), specificando
MQGMO_ALL_MSGS_AVAILABLEsi impedisce il richiamo dei messaggi appartenenti a gruppi incompleti. Tuttavia, tali messaggi contribuiscono ancora al valore dell'attributo della codaCurrentQDepth; ciò significa che potrebbero non essere presenti gruppi di messaggi richiamabili, anche seCurrentQDepthè maggiore di zero. Se non sono presenti altri messaggi richiamabili, il codice di erroreMQRC_NO_MSG_AVAILABLEviene restituito dopo la scadenza dell'intervallo di attesa specificato (se presente).L'elaborazione diMQGMO_ALL_MSGS_AVAILABLEdipende dal fatto cheMQGMO_LOGICAL_ORDERsia specificato o meno:- Se vengono specificate entrambe le opzioni,
MQGMO_ALL_MSGS_AVAILABLEha effetto solo quando non vi è alcun gruppo corrente o messaggio logico. Se è un gruppo corrente o un messaggio logico,MQGMO_ALL_MSGS_AVAILABLEviene ignorato. Ciò significa cheMQGMO_ALL_MSGS_AVAILABLEpuò rimanere attivo durante l'elaborazione dei messaggi in ordine logico. - Se
MQGMO_ALL_MSGS_AVAILABLEviene specificato senzaMQGMO_LOGICAL_ORDER,MQGMO_ALL_MSGS_AVAILABLEsempre ha effetto. Ciò significa che l'opzione deve essere disattivata dopo che il primo messaggio nel gruppo è stato rimosso dalla coda, per poter rimuovere i restanti messaggi nel gruppo.
Il corretto completamento di una chiamata MQGET specificando
MQGMO_ALL_MSGS_AVAILABLEsignifica che, al momento dell'emissione della chiamata MQGET , tutti i messaggi nel gruppo si trovavano nella coda. Tuttavia, tenere presente che altre applicazioni possono ancora rimuovere i messaggi dal gruppo (il gruppo non è bloccato per l'applicazione che richiama il primo messaggio nel gruppo).Se si omette questa opzione, i messaggi appartenenti ai gruppi possono essere richiamati anche quando il gruppo è incompleto.
MQGMO_ALL_MSGS_AVAILABLEimplicaMQGMO_ALL_SEGMENTS_AVAILABLE, che quindi non deve essere specificato.MQGMO_ALL_MSGS_AVAILABLEpuò essere specificato con una qualsiasi delle altre opzioniMQGMO_*e con una delle opzioniMQMO_*.- Su z/OS, questa opzione è supportata per code private e condivise, ma la coda deve avere un tipo di indice MQIT_GROUP_ID. Per le code condivise, l'oggetto CFSTRUCT a cui è associata la coda deve essere a CFLEVEL (3) o superiore.
- Su AIX, HP-UX, IBM i, Solaris, Linux, Windows, più IBM MQ MQI clients connessi a tali sistemi, questa opzione è supportata per tutte le code locali.
- Se vengono specificate entrambe le opzioni,
MQGMO_ALL_SEGMENTS_AVAILABLE- I segmenti in un messaggio logico diventano disponibili per il recupero solo quando tutti i segmenti nel messaggio logico sono disponibili. Se la coda contiene messaggi segmentati con alcuni dei segmenti mancanti (forse perché sono stati ritardati nella rete e non sono ancora arrivati), specificando
MQGMO_ALL_SEGMENTS_AVAILABLEsi impedisce il richiamo dei segmenti appartenenti a messaggi logici incompleti. Tuttavia, tali segmenti contribuiscono ancora al valore dell'attributo della codaCurrentQDepth; ciò significa che potrebbero non essere presenti messaggi logici richiamabili, anche seCurrentQDepthè maggiore di zero. Se non sono presenti altri messaggi richiamabili, il codice di erroreMQRC_NO_MSG_AVAILABLEviene restituito dopo la scadenza dell'intervallo di attesa specificato (se presente).L'elaborazione diMQGMO_ALL_SEGMENTS_AVAILABLEdipende dal fatto cheMQGMO_LOGICAL_ORDERsia specificato o meno:- Se vengono specificate entrambe le opzioni,
MQGMO_ALL_SEGMENTS_AVAILABLEha effetto solo quando non è presente alcun messaggio logico corrente. Se è un messaggio logico corrente,MQGMO_ALL_SEGMENTS_AVAILABLEviene ignorato. Ciò significa cheMQGMO_ALL_SEGMENTS_AVAILABLEpuò rimanere attivo durante l'elaborazione dei messaggi in ordine logico. - Se
MQGMO_ALL_SEGMENTS_AVAILABLEviene specificato senzaMQGMO_LOGICAL_ORDER,MQGMO_ALL_SEGMENTS_AVAILABLEsempre ha effetto. Ciò significa che l'opzione deve essere disattivata dopo che il primo segmento nel messaggio logico è stato rimosso dalla coda, in modo da poter rimuovere i restanti segmenti nel messaggio logico.
Se questa opzione non viene specificata, i segmenti del messaggio possono essere richiamati anche quando il messaggio logico è incompleto.
Mentre sia
MQGMO_COMPLETE_MSGcheMQGMO_ALL_SEGMENTS_AVAILABLErichiedono che tutti i segmenti siano disponibili prima che possano essere richiamati, il primo restituisce il messaggio completo, mentre il secondo consente ai segmenti di essere richiamati uno per uno.Se
MQGMO_ALL_SEGMENTS_AVAILABLEè specificato per un messaggio di report, il gestore code controlla la coda per verificare se esiste almeno un messaggio di report per ciascuno dei segmenti che costituiscono il messaggio logico completo. In tal caso, viene soddisfatta la condizioneMQGMO_ALL_SEGMENTS_AVAILABLE. Tuttavia, il gestore code non controlla il tipo dei messaggi di report presenti, pertanto potrebbe esserci una combinazione di tipi di report nei messaggi di report relativi ai segmenti del messaggio logico. Di conseguenza, l'esito positivo diMQGMO_ALL_SEGMENTS_AVAILABLEnon implica cheMQGMO_COMPLETE_MSGavrà esito positivo. Se è una combinazione di tipi di report presenti per i segmenti di un determinato messaggio logico, tali messaggi di report devono essere richiamati uno per uno.È possibile specificareMQGMO_ALL_SEGMENTS_AVAILABLEcon qualsiasi altra opzioneMQGMO_*e con una qualsiasi delle opzioniMQMO_*.- Su z/OS, questa opzione è supportata per code private e condivise, ma la coda deve avere un tipo di indice MQIT_GROUP_ID. Per le code condivise, l'oggetto CFSTRUCT a cui è associata la coda deve essere a CFLEVEL (3) o superiore.
- Su AIX, HP-UX, IBM i, Solaris, Linux, Windows, più IBM MQ MQI clients connessi a tali sistemi, questa opzione è supportata per tutte le code locali.
- Se vengono specificate entrambe le opzioni,
MQGMO_PROPERTIES_AS_Q_DEFLe proprietà del messaggio, eccetto quelle contenute nel descrittore del messaggio (o estensione), devono essere rappresentate come definito dall'attributo della coda
PropertyControl. Se viene fornito unMsgHandle, questa opzione viene ignorata e le proprietà del messaggio sono disponibili tramiteMsgHandle, a meno che il valore dell'attributo della codaPropertyControlnon siaMQPROP_FORCE_MQRFH2.Questa è l'azione predefinita se non vengono specificate opzioni della proprietà.
MQGMO_PROPERTIES_IN_HANDLELe proprietà del messaggio devono essere rese disponibili attraverso
MsgHandle. Se non viene fornita alcuna gestione messaggio, la chiamata non riesce con codice d'erroreMQRC_HMSG_ERROR.Nota: se il messaggio viene letto successivamente da un'applicazione che non crea un handle del messaggio, il gestore code inserisce le proprietà del messaggio in una strutturaMQRFH2. È possibile che la presenza di un'intestazioneMQRFH2non prevista interrompe il comportamento di una applicazione esistente.MQGMO_NO_PROPERTIESNon verrà richiamata alcuna proprietà del messaggio, ad eccezione di quelle contenute nel descrittore del messaggio (o estensione). Se è stato fornito un
MsgHandle, verrà ignorato.MQGMO_PROPERTIES_FORCE_MQRFH2Le proprietà del messaggio, eccetto quelle contenute nel descrittore del messaggio (o estensione) devono essere rappresentate utilizzando intestazioni
MQRFH2. Ciò fornisce la compatibilit ... con la versione precedente per le applicazioni che prevedono di recuperare le propriet ... ma non possono essere modificate per utilizzare gli handle dei messaggi. Se è stato fornito unMsgHandle, verrà ignorato.MQGMO_PROPERTIES_COMPATIBILITY- Se il messaggio contiene una proprietà con prefisso "mcd.", "jms.", "usr."o "mqext.", tutte le proprietà del messaggio vengono consegnate all'applicazione in un'intestazione
MQRFH2. Altrimenti tutte le proprietà del messaggio, eccetto quelle contenute nel descrittore messaggi (o nell'estensione), vengono eliminate e non sono più accessibili sull'applicazione.
MQGMO_NONE- Utilizzare questo valore per indicare che non sono state specificate altre opzioni;
tutte le opzioni assumono i propri valori predefiniti.
MQGMO_NONEsupporta la documentazione del programma; non è previsto che questa opzione venga utilizzata con altre, ma poiché il suo valore è zero, tale utilizzo non può essere rilevato.
Il valore iniziale del campo Options è MQGMO_NO_WAIT più MQGMO_PROPERTIES_AS_Q_DEF.
MQGMO_LOCK
viene considerata come una chiamata non browse.