This section describes the steps undertaken by each execution thread created by mtaDequeueStart(). Each execution thread processes a subset of the channel’s queued messages by repeatedly calling the caller-supplied processing routine, process_message().
To process queued messages, a processing thread takes the following steps:
The thread sets ctx2 to have the value NULL:
ctx2 = NULL;
For information on the process_message() arguments, see The process_message() Routine.
The execution thread communicates with the Job Controller to obtain a message file to process. If there are no more message files to process, then go to Step 9.
For the message file, the execution thread creates a dequeue context that maintains the dequeue processing state for that message file.
The execution thread then invokes the caller-supplied process_message() routine, passing to it the dequeue context created in Processing the Message Queue, as shown in the example that follows:
istat = process_message(&ctx2, ctx1, &dq_ctx, env_from, env_from_len);
For information on the call arguments for process_message(), see The process_message() Routine.
The process_message() routine then attempts to process the message, ultimately removing it from the channel’s queue, or leaving the message file for a later processing attempt.
If mtaDequeueMessageFinish() was not called before process_message() returned, then the queued message is deferred. That is, its underlying message file is left in the channel’s queue and a later processing attempt is scheduled.
The dequeue context is destroyed.
If the process_message() routine did not return the MTA_ABORT status code, then repeat this cycle starting at Step 2.
If a caller-supplied process_done() routine was passed to mtaDequeueStart(), it is called now, for example:
process_done(&ctx2, ctx1);
Through the process_done() routine, the program can perform any cleanup necessary for the execution thread. For example, freeing up any private context and associated resources stored in the ctx2 call argument.
For a description of the process_done() routine, see The process_done() Routine, as well as process_done() Routine.
The thread exits.
For an example of how state (context) may be preserved within an execution thread and across calls to process_message(), A Complex Dequeuing Example.