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.

ExitMożliwe kanały
Message exitSender channel, Server channel, Cluster- sender channel, Receiver channel, Requester channel, Cluster- receiver channel
Message - retry exitReceiver channel, Requester channel, Cluster- receiver channel
Receive exitSender channel, Server channel, Cluster- sender channel, Receiver channel, Requester channel, Cluster- receiver channel, Client- connection channel, Server- connection
Security exitSender channel, Server channel, Cluster- sender channel, Receiver channel, Requester channel, Cluster- receiver channel, Client- connection channel, Server- connection
Send exitSender channel, Server channel, Cluster- sender channel, Receiver channel, Requester channel, Cluster- receiver channel, Client- connection channel, Server- connection
Auto - definition exitCluster - 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
Zachęcam do przedstawienia swoich uwag i opinii w polu komentarzy.

Komentarze

Dodaj Komentarz