Exity są to specjalne aplikacje powiązane z kanałami MQ uruchamiane przez proces MCA.
W zależności od tego jakiego typu są to exity i z jakim typem kanału są one związane, mogą mieć różne
zastosowanie. Pozwalają one np. na weryfikacje strony klienckiej przy próbie połączenie i pozwolić lub
nie na nawiązanie połączenia. Mogą służyć do manipulacji komunikatami zanim zostaną one odczytane przez
aplikacje.
Rozróżniamy następujące typy exitów:
Message exit
Ten typ exita jest wywoływany przy każdej obsłudze komunikatu.
Tego typu exit jest wywoływany zaraz po wywołaniu metody MQGET przez proces MCA po stronie wysyłającej,
przed wywołaniem metody MQPUT przez proces MCA po stronie odbierającej, oraz przy inicjacji i kończeniu pracy
procesu MCA.
Możemy np. za pomocą tego exita przed wysłaniem go po sieci treść komunikatu zakodować po stronie sender,
a następnie odkodować po stronie reciever. Możemy tu również zmieniać dowolne pola nagłówka MQMD.
Message-retry exit
Tego typu exit jest wywoływany, kiedy nie udało się otworzyć docelową kolejkę.
Możemy tu np. ustawiać jak często i z jaką częstotliwością ponawiać próbę umieszczenia komunikatu w kolejce.
Receive exit
Tego typu exit jest wywoływany zaraz po pojawieniu się transmisji po sieci oraz przy inicjacji i kończeniu pracy
procesu MCA.
Security exit
Jest to chyba najczęściej spotykany typ exita.
Tego typu exit jest wywoływany zaraz po zakończeniu procesu negocjacji przy starcie kanału po obu stronach
oraz przy inicjacji i kończeniu pracy procesu MCA.
Pozwala on na autentykację drugiej strony komunikacji.
Za pomocą tego exita możemy po stronie odbierającej kanału oczekiwać na wysłanie przez drugą stronę hasła
pozwalającego na komunikację. W takim przypadku po drugiej stronie kanału potrzebne jest zastosowanie innego
security exita, który wysłałby takie hasło.
Send exit
Tego typu exit jest wywoływany przed transmisją po sieci oraz przy inicjacji i kończeniu pracy
procesu MCA.
Auto-definition exit
Tego typu exit jest wywoływany, kiedy staramy się wystartować konał typu auto-definition.
Możemy tu np. zmieniać definicję tworzonego kanału.
Rozróżniamy następujące tryby wywołań exita:
MQXR_INIT
Ten tryb oznacza, że exit jest wywoływany po raz pierwszy. W tym miejscu możemy zainicjować zewnętrzne zasoby,
oraz ogólnie zainicjować jego pracę.
MQXR_TERM
Ten tryb jest przeciwieństwem poprzedniego. Oznacza on, że exit jest w ostatniej fazie procesowania i to jest
najlepsze miejsce do zwolnienia wszystkich zainicjowanych zasobów wcześniej podczas trybu
MQXR_INIT
.
MQXR_MSG
Ten tryb oznacza, że exit jest w trakcie procesowanie komunikatu. Tryb ten jest związany tylko i wyłącznie z
exitami typu message.
MQXR_XMIT
Ten tryb oznacza, że exit jest w trakcie transmisji danych. Tryb ten jest związany tylko i wyłącznie z
exitami typu send i receive.
MQXR_SEC_MSG
Ten tryb oznacza, że exit jest w trakcie procesowania danych security. Tryb ten jest związany tylko i wyłącznie z
exitami typu security.
MQXR_INIT_SEC
Ten tryb występuje zaraz po pojawieniu się trybu
MQXR_INIT
w przypadku security exita po stronie reciever. Jeśli teraz zostanie zwrócona odpowiedź
MQXCC_OK
, to po stronie security exita typu sender zostanie wygenerowany tryb
MQXR_INIT_SEC
.
Jeśli teraz zostanie zwrócona odpowiedź
MQXCC_SEND_SEC_MSG
lub
MQXCC_SEND_AND_REQUEST_SEC_MSG
, to po stronie security exita typu sender nie zostanie wygenerowany nigdy tryb
MQXR_INIT_SEC
tylko
MQXR_SEC_MSG
.
Tryb ten jest związany tylko i wyłącznie z exitami typu security.
MQXR_RETRY
Ten tryb jest wywoływany w przypadku ponownej próby umieszczenia komunikatu w kolejce po pojawieniu się błędu.
Tryb ten jest związany tylko i wyłącznie z exitami typu message-retry.
MQXR_AUTO_CLUSSDR
Ten tryb jest wywoływany w przypadku automatycznego utworzenia kanału typu cluster-sender.
Tryb ten jest związany tylko i wyłącznie z exitami typu auto-definition.
MQXR_AUTO_RECEIVER
Ten tryb jest wywoływany w przypadku automatycznego utworzenia kanału typu receiver.
Tryb ten jest związany tylko i wyłącznie z exitami typu auto-definition.
MQXR_AUTO_SVRCONN
Ten tryb jest wywoływany w przypadku automatycznego utworzenia kanału typu server-connection.
Tryb ten jest związany tylko i wyłącznie z exitami typu auto-definition.
MQXR_AUTO_CLUSRCVR
Ten tryb jest wywoływany w przypadku automatycznego utworzenia kanału typu cluster-receiver.
Tryb ten jest związany tylko i wyłącznie z exitami typu auto-definition.
MQXR_SEC_PARMS
Ten tryb jest wywoływany w celu poinformowania iż struktura MQCSP została przesłana do exita.
Rozróżniamy następujące typy odpowiedzi exita:
MQXCC_OK
Ten typ oznacza, że procesowanie w exicie zakończyło się sukcesem.
MQXCC_SUPPRESS_FUNCTION
Ten typ oznacza, że kanał powinien zostać przerwany.
MQXCC_SEND_SEC_MSG
Ten typ oznacza, że exit drugiej stronie przekazuje dane.
Tryb ten jest związany tylko i wyłącznie z exitami typu security.
MQXCC_SEND_AND_REQUEST_SEC_MSG
Ten typ oznacza, że exit drugiej stronie przekazuje dane oraz dodatkowa, że oczekuje na odpowiedź.
Tryb ten jest związany tylko i wyłącznie z exitami typu security.
MQXCC_SUPPRESS_EXIT
MQXCC_CLOSE_CHANNEL
Ten typ oznacza, że MCA powinien zamknąć kanał.
Tryb ten jest związany ze wszystkimi typami exitów za wyjątkiem exitów typu auto-definition.
Poniższa tabelka ukazuje możliwe exity i rodzaje kanałów do których mogą być one podpięte.
| Exit |
Możliwe kanały |
| Message exit |
Sender channel, Server channel, Cluster- sender channel, Receiver channel, Requester channel, Cluster- receiver channel |
 |
| Message- retry exit |
Receiver channel, Requester channel, Cluster- receiver channel |
 |
| Receive exit |
Sender channel, Server channel, Cluster- sender channel, Receiver channel, Requester channel, Cluster- receiver channel, Client- connection channel, Server- connection |
 |
| Security exit |
Sender channel, Server channel, Cluster- sender channel, Receiver channel, Requester channel, Cluster- receiver channel, Client- connection channel, Server- connection |
 |
| Send exit |
Sender channel, Server channel, Cluster- sender channel, Receiver channel, Requester channel, Cluster- receiver channel, Client- connection channel, Server- connection |
 |
| Auto- definition exit |
Cluster- sender channel, Receiver channel, Requester channel, Cluster- receiver channel, Server- connection |
 |
{%1}
| Wywoływana funkcja i struktury exita |
Wywoływana funkcja
void MQENTRY Exit( PMQCXP pChannelExitParms,
PMQCD pChannelDefinition,
PMQLONG pDataLength,
PMQLONG pAgentBufferLength,
PMQCHAR pAgentBuffer,
PMQLONG pExitBufferLength,
PMQCHAR *pExitBufferAddr)
Struktura MQCXP
struct tagMQCXP {
MQCHAR4 StrucId; /* Structure identifier */
MQLONG Version; /* Structure version number */
MQLONG ExitId; /* Type of exit */
MQLONG ExitReason; /* Reason for invoking exit */
MQLONG ExitResponse; /* Response from exit */
MQLONG ExitResponse2; /* Secondary response from exit */
MQLONG Feedback; /* Feedback code */
MQLONG MaxSegmentLength; /* Maximum segment length */
MQBYTE16 ExitUserArea; /* Exit user area */
MQCHAR32 ExitData; /* Exit data */
MQLONG MsgRetryCount; /* Number of times the message has
been retried */
MQLONG MsgRetryInterval; /* Minimum interval in milliseconds
after which the put operation
should be retried */
MQLONG MsgRetryReason; /* Reason code from previous attempt
to put the message */
MQLONG HeaderLength; /* Length of header information */
MQCHAR48 PartnerName; /* Partner Name */
MQLONG FAPLevel; /* Negotiated Formats and Protocols
level */
MQLONG CapabilityFlags; /* Capability flags */
MQLONG ExitNumber; /* Exit number */
/* Ver:3 */
/* Ver:4 */
MQLONG ExitSpace; /* Number of bytes in transmission
buffer reserved for exit to use */
/* Ver:5 */
MQCHAR12 SSLCertUserid; /* User identifier associated
with remote SSL certificate */
MQLONG SSLRemCertIssNameLength; /* Length of distinguished
name of issuer of remote
SSL certificate */
MQPTR SSLRemCertIssNamePtr; /* Address of distinguished
name of issuer of remote
SSL certificate */
PMQCSP SecurityParms; /* Address of security parameters */
MQLONG CurHdrCompression; /* Header data compression
used for current message */
MQLONG CurMsgCompression; /* Message data compression
used for current message */
/* Ver:6 */
};
Struktura MQCD
struct tagMQCD {
MQCHAR ChannelName[20]; /* Channel definition name */
MQLONG Version; /* Structure version number */
MQLONG ChannelType; /* Channel type */
MQLONG TransportType; /* Transport type */
MQCHAR Desc[64]; /* Channel description */
MQCHAR QMgrName[48]; /* Queue-manager name */
MQCHAR XmitQName[48]; /* Transmission queue name */
MQCHAR ShortConnectionName[20]; /* First 20 bytes of connection
name */
MQCHAR MCAName[20]; /* Reserved */
MQCHAR ModeName[8]; /* LU 6.2 Mode name */
MQCHAR TpName[64]; /* LU 6.2 transaction program
name */
MQLONG BatchSize; /* Batch size */
MQLONG DiscInterval; /* Disconnect interval */
MQLONG ShortRetryCount; /* Short retry count */
MQLONG ShortRetryInterval; /* Short retry wait interval */
MQLONG LongRetryCount; /* Long retry count */
MQLONG LongRetryInterval; /* Long retry wait interval */
MQCHAR SecurityExit[128]; /* Channel security exit name*/
MQCHAR MsgExit[128]; /* Channel message exit name */
MQCHAR SendExit[128]; /* Channel send exit name */
MQCHAR ReceiveExit[128]; /* Channel receive exit name */
MQLONG SeqNumberWrap; /* Highest allowable message
sequence number */
MQLONG MaxMsgLength; /* Maximum message length */
MQLONG PutAuthority; /* Put authority */
MQLONG DataConversion; /* Data conversion */
MQCHAR SecurityUserData[32]; /* Channel security exit user
data */
MQCHAR MsgUserData[32]; /* Channel message exit user
data */
MQCHAR SendUserData[32]; /* Channel send exit user
data */
MQCHAR ReceiveUserData[32]; /* Channel receive exit user
data */
/* Ver:1 */
MQCHAR UserIdentifier[12]; /* User identifier */
MQCHAR Password[12]; /* Password */
MQCHAR MCAUserIdentifier[12]; /* First 12 bytes of MCA user
identifier */
MQLONG MCAType; /* Message channel agent type*/
MQCHAR ConnectionName[264]; /* Connection name */
MQCHAR RemoteUserIdentifier[12]; /* First 12 bytes of user
identifier from partner */
MQCHAR RemotePassword[12]; /* Password from partner */
/* Ver:2 */
MQCHAR MsgRetryExit[128]; /* Channel message retry exit
name */
MQCHAR MsgRetryUserData[32]; /* Channel message retry exit
user data */
MQLONG MsgRetryCount; /* Number of times MCA will try
to put the message, after
first attempt has failed */
MQLONG MsgRetryInterval; /* Minimum interval in
milliseconds after which the
open or put operation will
be retried */
/* Ver:3 */
MQLONG HeartbeatInterval; /* Time in seconds between
heartbeat flows */
MQLONG BatchInterval; /* Batch duration */
MQLONG NonPersistentMsgSpeed; /* Speed at which nonpersistent
messages are sent */
MQLONG StrucLength; /* Length of MQCD structure */
MQLONG ExitNameLength; /* Length of exit name */
MQLONG ExitDataLength; /* Length of exit user data */
MQLONG MsgExitsDefined; /* Number of message exits
defined */
MQLONG SendExitsDefined; /* Number of send exits
defined */
MQLONG ReceiveExitsDefined; /* Number of receive exits
defined */
MQPTR MsgExitPtr; /* Address of first MsgExit
field */
MQPTR MsgUserDataPtr; /* Address of first MsgUserData
field */
MQPTR SendExitPtr; /* Address of first SendExit
field */
MQPTR SendUserDataPtr; /* Address of first
SendUserData field */
MQPTR ReceiveExitPtr; /* Address of first ReceiveExit
field */
MQPTR ReceiveUserDataPtr; /* Address of first
ReceiveUserData field */
/* Ver:4 */
MQPTR ClusterPtr; /* Address of a list of cluster
names */
MQLONG ClustersDefined; /* Number of clusters to which
the channel belongs */
MQLONG NetworkPriority; /* Network priority */
/* Ver:5 */
MQLONG LongMCAUserIdLength; /* Length of long MCA user
identifier */
MQLONG LongRemoteUserIdLength; /* Length of long remote user
identifier */
MQPTR LongMCAUserIdPtr; /* Address of long MCA user
identifier */
MQPTR LongRemoteUserIdPtr; /* Address of long remote user
identifier */
MQBYTE40 MCASecurityId; /* MCA security identifier */
MQBYTE40 RemoteSecurityId; /* Remote security identifier*/
/* Ver:6 */
MQCHAR SSLCipherSpec[32]; /* SSL CipherSpec */
MQPTR SSLPeerNamePtr; /* Address of SSL peer name */
MQLONG SSLPeerNameLength; /* Length of SSL peer name */
MQLONG SSLClientAuth; /* Whether SSL client
authentication is required */
MQLONG KeepAliveInterval; /* Keepalive interval */
MQCHAR LocalAddress[48]; /* Local communications
address */
MQLONG BatchHeartbeat; /* Batch heartbeat interval */
/* Ver:7 */
MQLONG HdrCompList[2]; /* Header data
compression list */
MQLONG MsgCompList[16]; /* Message data
compression list */
MQLONG CLWLChannelRank; /* Channel rank */
MQLONG CLWLChannelPriority; /* Channel priority */
MQLONG CLWLChannelWeight; /* Channel weight */
MQLONG ChannelMonitoring; /* Channel monitoring */
MQLONG ChannelStatistics; /* Channel statistics */
/* Ver:8 */
};
Powrót