We have a new process that we implemented that is not working very efficiently.
Basically, we have a CICS program that receives a request for all customer information. The program then reads a customer master that has many (sometimes dozens) of trailers. Each trailer has a key to an account on a different application. The program cycles through the trailers sequentially, reads the information from the master indicated on the trailer and then formats part of a response back to the caller. When all of the trailers are processed, one full response is returned to the calling program.
The problem is that one application in particular is very slow for each individual response (we're not just reading a file on our system - we have to call a program that transmits the query out to another vendor and finally returns it back to the program) . So, if the customer has a lot of accounts on this application, we can sometimes time out when we're processing sequentially like this.
I started looking into processing the transaction asynchronously. I want to fire off all of my requests to the slow application first, process all remaining trailers and then come back and collect all of the responses that come back from my initial requests.
I was pretty excited when I saw the Run and Fetch APIs. They address exactly what I'm looking for. Unfortunately, we don't have that CICS version.
Instead, it sounds like START and RETRIEVE may be what I need to go with. Is it correct that I can shoot off a START for each one of my "slow" application requests and come back with a RETRIEVE at the end of my processing to pick them back up? If so, what kind of response do I get if the RETRIEVE isn't ready yet? Can I just move onto the next one (recycling through until I finally get them all)?
Or, is there a better way of doing this? i.e. Would it be better to have each of the started transactions write their responses to a temporary queue and just have my main, calling program read the queue as a final step? Or... something else?
So the problem is with Vendor application which indirectly causing the whole trx slow down. is that what you are telling?
I am not sure if this will work.
1. Get all the trailer data PUT in request -MQ ('X') with some timestamp token and continue your further processing ...
2. add a transaction that triggers the Vender application program
3. Let the Vendor his part and PUT back the response into response-MQ ( 'Y')
4.at the end of the main program you get do a GET on 'Y' MQ and validate the timestamp token and once matched then formulate the final response back to the caller else you can DELAY and GET again till whatever time caller and you agree upon the WAIT.