Spis treści
Exity
21 stycznia 2011, godz 13:24
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.
Typy exitów
Poniżej znajduje się lista możliwych typów 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.
Tryby wywołań exita
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.
Typy odpowiedzi 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 |
Wywoływana funkcja i struktury exita
Wywoływana funkcja
PMQCD pChannelDefinition,
PMQLONG pDataLength,
PMQLONG pAgentBufferLength,
PMQCHAR pAgentBuffer,
PMQLONG pExitBufferLength,
PMQCHAR *pExitBufferAddr)
Struktura MQCXP
MQCHAR4StrucId;/* Structure identifier */
MQLONGVersion;/* Structure version number */
MQLONGExitId; /* Type of exit */
MQLONGExitReason; /* Reason for invoking exit */
MQLONGExitResponse;/* Response from exit */
MQLONGExitResponse2;/* Secondary response from exit */
MQLONGFeedback;/* Feedback code */
MQLONGMaxSegmentLength;/* Maximum segment length */
MQBYTE16ExitUserArea;/* Exit user area */
MQCHAR32ExitData;/* Exit data */
MQLONGMsgRetryCount;/* Number of times the message has
been retried */
MQLONGMsgRetryInterval;/* Minimum interval in milliseconds
after which the put operation
should be retried */
MQLONGMsgRetryReason; /* Reason code from previous attempt
to put the message */
MQLONGHeaderLength;/* Length of header information */
MQCHAR48PartnerName;/* Partner Name */
MQLONGFAPLevel;/* Negotiated Formats and Protocols
level */
MQLONGCapabilityFlags;/* Capability flags */
MQLONGExitNumber; /* Exit number */
/* Ver:3 */
/* Ver:4 */
MQLONGExitSpace;/* Number of bytes in transmission
buffer reserved for exit to use */
/* Ver:5 */
MQCHAR12SSLCertUserid;/* User identifier associated
with remote SSL certificate */
MQLONGSSLRemCertIssNameLength;/* Length of distinguished
name of issuer of remote
SSL certificate */
MQPTR SSLRemCertIssNamePtr;/* Address of distinguished
name of issuer of remote
SSL certificate */
PMQCSPSecurityParms;/* Address of security parameters */
MQLONGCurHdrCompression;/* Header data compression
used for current message */
MQLONGCurMsgCompression;/* Message data compression
used for current message */
/* Ver:6 */
};
Struktura MQCD
struct tagMQCD {
MQCHARChannelName[20];/* Channel definition name */
MQLONGVersion;/* Structure version number */
MQLONGChannelType;/* Channel type */
MQLONGTransportType; /* Transport type */
MQCHARDesc[64];/* Channel description */
MQCHARQMgrName[48];/* Queue-manager name */
MQCHARXmitQName[48]; /* Transmission queue name */
MQCHARShortConnectionName[20];/* First 20 bytes of connection
name */
MQCHARMCAName[20];/* Reserved */
MQCHARModeName[8];/* LU 6.2 Mode name */
MQCHARTpName[64];/* LU 6.2 transaction program
name */
MQLONGBatchSize; /* Batch size */
MQLONGDiscInterval;/* Disconnect interval */
MQLONGShortRetryCount;/* Short retry count */
MQLONGShortRetryInterval;/* Short retry wait interval */
MQLONGLongRetryCount;/* Long retry count */
MQLONGLongRetryInterval; /* Long retry wait interval */
MQCHARSecurityExit[128]; /* Channel security exit name*/
MQCHARMsgExit[128];/* Channel message exit name */
MQCHARSendExit[128]; /* Channel send exit name */
MQCHARReceiveExit[128];/* Channel receive exit name */
MQLONGSeqNumberWrap; /* Highest allowable message
sequence number */
MQLONGMaxMsgLength;/* Maximum message length */
MQLONGPutAuthority;/* Put authority */
MQLONGDataConversion;/* Data conversion */
MQCHARSecurityUserData[32];/* Channel security exit user
data */
MQCHARMsgUserData[32];/* Channel message exit user
data */
MQCHARSendUserData[32];/* Channel send exit user
data */
MQCHARReceiveUserData[32];/* Channel receive exit user
data */
/* Ver:1 */
MQCHARUserIdentifier[12];/* User identifier */
MQCHARPassword[12];/* Password */
MQCHARMCAUserIdentifier[12]; /* First 12 bytes of MCA user
identifier */
MQLONGMCAType;/* Message channel agent type*/
MQCHARConnectionName[264];/* Connection name */
MQCHARRemoteUserIdentifier[12];/* First 12 bytes of user
identifier from partner */
MQCHARRemotePassword[12];/* Password from partner */
/* Ver:2 */
MQCHARMsgRetryExit[128]; /* Channel message retry exit
name */
MQCHARMsgRetryUserData[32];/* Channel message retry exit
user data */
MQLONGMsgRetryCount; /* Number of times MCA will try
to put the message, after
first attempt has failed */
MQLONGMsgRetryInterval;/* Minimum interval in
milliseconds after which the
open or put operation will
be retried */
/* Ver:3 */
MQLONGHeartbeatInterval; /* Time in seconds between
heartbeat flows */
MQLONGBatchInterval; /* Batch duration */
MQLONGNonPersistentMsgSpeed; /* Speed at which nonpersistent
messages are sent */
MQLONGStrucLength;/* Length of MQCD structure */
MQLONGExitNameLength;/* Length of exit name */
MQLONGExitDataLength;/* Length of exit user data */
MQLONGMsgExitsDefined;/* Number of message exits
defined */
MQLONGSendExitsDefined;/* Number of send exits
defined */
MQLONGReceiveExitsDefined;/* 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
