On 21-Feb-2014 16:59 -0800, James H. H. Lampert wrote:
Here's the scenario:

I'm calling Scott Klement's JDBCR4 service program (actually, my own
expanded version thereof, but...). I try to connect to a system that
rejects the connection. A procedure in the service program puts a
diagnostic message in the joblog, a CPF9897 with the text (at least
in the version of the scenario I can readily reproduce) "The
application server rejected the connection. (General security

I want to be able to retrieve and display this diagnostic from the
program (ILE RPG, FWIW, but this is presumably a system API
question, not an RPG question) that called JDBCR4.

If F9 the message, I get (and JDBCR4QV is my expanded JDBCR4):

From program . . . . . . . . . : JDBCR4QV
From library . . . . . . . . : AQUESTVIEW
From module . . . . . . . . : JDBCR4
From procedure . . . . . . . : JNI_CHECKERROR
From statement . . . . . . . : 7209

To program . . . . . . . . . . : JDBCR4QV
To library . . . . . . . . . : AQUESTVIEW
To module . . . . . . . . . : JDBCR4
To procedure . . . . . . . . : JNI_CHECKERROR
To statement . . . . . . . . : 7209

I can see the message by doing a DSPJOBLOG, but I can't figure out
how to make the calling program see it. Can I do so without further
modifications to my expanded JDBCR4?

If an application intends that the invoking program should be able to access the message, the application either should be sending [e.g. Resend Escape Message (QMHRSNEM) API or Send Program Message (QMHSNDPM) API or CL command (SNDPGMMSG)] directly to the invoker or moving the messages up-the-stack [Move Program Messages (QMHMOVPM) API]. When the application instead sends the messages only to the invoked procedure or program or only to the procedures within [i.e. to\within itself], then the access to those message from the invoker is difficult. There is a procedure documented to receive the messages; I could not easily locate a link. That method involves obtaining a message mark prior to the invocation of the application that does not /play well with others/, and then repeatedly invoke the Receive Program Message (QMHRCVPM) API or the CL command (RCVMSG) with a decremented message key value while also monitoring and handling [best to include the removal of] the conditions of "message key not found"; being a stand-alone procedure the procedure could globally monitor\ignore that exception, and then remove all messages in its queue upon completion, rather than RCVMSG RMV(*YES) after each instance of that exception.

If I had access to the source of the application that sends the messages, I would prefer to /correct/ that application to move the messages up to the invoker.

Hmmm... I had already found the link, in essence; i.e. the link was found at the bottom of the topic _Call message queue_ with the parent topic _Job message queues_ that I found by searching InfoCenter on the tokens:
receiving messages stack

IBM i 7.1 Information Center -> Programming -> Control language -> Messages -> Message queues -> Job message queues
_Call message queue_
"A call message queue is used to send messages between one program or procedure and another program or procedure.

As long as a program or procedure is on the call stack (has not returned yet), its call message queue is active and messages can be sent to that program or procedure. After the program or procedure returns, messages can no longer be sent to it. Message types which can be sent to a call message queue include informational, request, completion, diagnostic, status, escape, and notify.
Note: When you are using the command entry display, you can display all the messages sent to the job message queue by pressing F10 (Include detailed messages). After the messages are displayed, you can roll through them using one of the roll keys.

You can also display the messages for a job by using the Display Job Log (DSPJOBLOG) command.

Parent topic: _Job message queues_

Related tasks:
_Receiving a message from a program or procedure that has ended_

IBM i 7.1 Information Center -> Programming -> Control language -> Messages
_Receiving a message from a program or procedure that has ended_
"Occasionally, there is a need to receive messages from the job log that are sent to a call message queue that is no longer active.

For example, PGMA calls PGMB and PGMB sends a diagnostic message to itself and an escape message to PGMA. PGMA can easily receive the escape message that was sent to it, but sometimes it is necessary to also receive the diagnostic message. Because the diagnostic is on a call message queue that is no longer active, the message must be received by using a message reference key. This can be done, but it takes more work than one simple receive message command.

Return to Archive home page | Return to MIDRANGE.COM home page