Spis treści
Exity
Autor: Marcin Kasiński
21.01.2011 13:24:00 +0200
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
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
Komentarze
Dodaj Komentarz
Newsletter
Jeżeli chcesz być na bieżąco informowany o aktualnościach i poradach IT zapisz się do naszego newslettera.