MainframeSupports
tip uge 42/2006:

MQ er et fantastisk system til at sende en meddelelse fra et system til et andet. Der gik ikke en gang et split-sekund fra at MQ blev introduceret til at kunderne brugte det til at sende svar tilbage. I praksis benytter de fleste installationer MQ til remote procedure calls med alle de problemer det giver i MQ med to units of work til een transaktion.

Et andet aspekt af brugen af MQ til remote procedure calls er time out problematikken. Den oprindelige udsteder af et remote procedure call kan jo ikke stå og vente til evig tid på et svar. Derfor benytter stort set alle sig af en maksimum ventetid. Når den er gået, så fortsætter man uanset om svaret når frem på et senere tidspunkt. Hvis svaret når frem efter time out ligger det typisk og fylder op på svar køen. Hvis det er vigtigt for forretningen at få behandlet svaret, så må man kode en form for efterbehandling, og hvis det er knap så vigtigt (måske en forespørgsel, der kan gentages), så skal svaret helst fjernes, så det ikke fylder op på svar køen. Nu er MQ så viseligt indrettet, så man faktisk kan få MQ til selv at rydde op, og det er netop hvad dette tip handler om.

I message descriptoren (MQMD arealet) findes der et felt kaldet MQMD-EXPIRY (hvis du foretrækker programmeringssprog, med underscore, så erstart bindestregen med en sådan). Default for feltet er værdien af MQ konstanten MQEI-UNLIMITED, som indeholder værdien -1 (high-values) og betyder, at meddelelsen holder indtil nogen gider at MQGET'te den. Du kan selv sætte MQMD-EXPIRY til det antal tiendedele sekunder, du ønsker at meddelelsen maksimalt skal leve i. Hvis du sætter MQMD-EXPIRY til 0, så fejler MQPUT eller MQPUT1.

Antag nu, at du højst vil vente 10 sekunder på svaret fra dit remote procedure call, og at et forsinket svar betragtes som bare ærgerligt. Så kan du sætte MQMD-EXPIRY til 100 på din request meddelelse (den du sender til remoten) og remoten kan sende svaret med samme MQMD-EXPIRY. Effekten er, at forsinkede meddelelser simpelthen forsvinder helt automatisk. Se det er rigtig fikst. Det vigtige er at sætte MQMD-EXPIRY til samme værdi som ventetiden. Bemærk i øvrigt, at ventetiden angives i hundrededele sekunder og ikke i tiendedele, ret ufikst.

Når du laver en MQGET, så vil værdien af feltet MQMD-EXPIRY ikke være den oprindelige fra MQPUT kaldet. MQMD-EXPIRY tælles nemlig ned af MQ på sin vej fra afsender til modtager. Hvis man ved, at afsenderen satte den til 100 og den står til 70 efter MQGET, så har den været ca. 3 sekunder undervejs. Man kan så sætte MQMD-EXPIRY på svaret til den resterende tid og dermed opnå en endnu mere optimal automatisk oprydning, da de to meddelelser tilsammen højst kommer til at leve i 10 sekunder. Det har også den fordel, at remoten ikke behøver at kende afsenderens ventetid.

Forrige danske tip        Last tip in english        Tip oversigten