|
RSS Feed - WebSphere MQ Support
|
RSS Feed - Message Broker Support
|
Workload balancing not working as expected |
« View previous topic :: View next topic » |
Author |
Message
|
Nigelg |
Posted: Tue Sep 28, 2004 3:18 am Post subject: |
|
|
Grand Master
Joined: 02 Aug 2004 Posts: 1046
|
The final check is NOT on date/time, it is on the channel sequence number. |
|
Back to top |
|
 |
PeterPotkay |
Posted: Tue Sep 28, 2004 12:40 pm Post subject: |
|
|
 Poobah
Joined: 15 May 2001 Posts: 7722
|
Well Nigelg, sequence #s are used, but in an interesting way.
QM1, QM2, QM3 and QM4 are in CLUSTER1.
QM1 and QM2 host QueueA, and QueueA is clustered on both.
QM2 and QM3 host QueueB, and QueueB is clustered on both.
QM4 hosts no queues, it is a gateway.
AppA connects to QM4, and starts putting a message every second to QueueA. As expected, the messages round robin between QM1 and QM2.
A few minutes later, (while AppA is still running) AppB connects to QM4, and starts putting 300 messages a second to QueueB. As expected, those messages equally round robin between QM2 and QM3. BUT, all of a sudden, all of AppA's messages start going to QM1 only.
It seems that QM4 is weighing in the heavy use of the channel to QM2 by AppB against AppA's round robining, presumambly by seeing that the sequence number is rising much faster on channel TO.QM2 (because of AppB) than TO.QM1.
Once AppB ends, AppA's messages go back to round robining between QM1 and QM2 evenly. But the "damage" has been done. All the while the AppB was running, AppA's messages would not go to QM2 (but I expect if they were explicitly addresses to QM2, they would).
So it looks like when the algorithim compares the sequence numbers between 2 channels, it compares not which sequence number is bigger, but which one has changed more since the last time it checked. Note in the above test that after AppB was done, the sequence number on TO.QM2 was much bigger than TO.QM1, but was no longer *changing* rapidly, so AppA got its round robining behaviour back.
Kind of lame that one heavy duty app can disrupt the round robining behaviour for every other app in a cluster.  _________________ Peter Potkay
Keep Calm and MQ On |
|
Back to top |
|
 |
Nigelg |
Posted: Wed Sep 29, 2004 12:30 am Post subject: |
|
|
Grand Master
Joined: 02 Aug 2004 Posts: 1046
|
Peter, I do have access to the algorithm code (as you asked earlier), and I can assure you that the sequence number check is a straight comparison, which one is higher. The msg goes on the channel with the lowest sequence number.
You can see this in a trace, where each possible choice has some details dumped:
Choice:nn ChannelName XXX ChannelStatus n ThisPriority xNNNN NetPriority n ChannelSequence nnnn
ThisPriority is a combination of the flags mentioned in your earlier post before getting to the NetPriority and ChannelSequence.
You will see that if ThisPriority and NetPriority are the same, that the channel with the lowest ChannelSequence is chosen.
I agree with you that this is a rather crude way to decide, and that an app making heavy use of queues hosted on a subset of qmgrs in the cluster would bias the behaviour of other apps. |
|
Back to top |
|
 |
PeterPotkay |
Posted: Wed Sep 29, 2004 7:07 am Post subject: |
|
|
 Poobah
Joined: 15 May 2001 Posts: 7722
|
Nigelg wrote: |
Peter, I do have access to the algorithm code (as you asked earlier), and I can assure you that the sequence number check is a straight comparison, which one is higher. The msg goes on the channel with the lowest sequence number. |
If AppB send 1,000,000 messages down channels TO.QM2 and TO.QM3, while AppA slowly sends 1 message a second down TO.QM1 and TO.QM2, wouldn't you agree that the sequence number for TO.QM2 is going to be much higher for a loooong time after AppB ends compared to the sequence number for TO.QM1? And if your statement is true, then messages wouldn't round robin between QM1 and QM2 for a looooong time after AppB ended? Which is not happening. As soon as AppB ends, the sequence number stops *rising* rapidly on TO.QM2, and round robining starts working normally for AppA. So I gotta think its not a straight comparison of which sequence number is higher, but rather a comparison of what sequence numbers have changed the most since the last check. _________________ Peter Potkay
Keep Calm and MQ On |
|
Back to top |
|
 |
RatherBeGolfing |
Posted: Wed Sep 29, 2004 7:28 am Post subject: |
|
|
 Centurion
Joined: 12 Nov 2002 Posts: 118 Location: Syracuse, NY, USA
|
I have finally had some time to revisit my scenario - way back on page 1 of this thread. I looked at the sequence numbers on my CLUSRCVR channels for my QM2 and QM3 managers. Sure enough, the seqno for QM2 was 68,618, the seqno for QM3 was 223. I couldn't figure out how to reset the sequence numbers (probably have to visit each QMgr who has a CLUSSDR to QM2 or QM3 and reset at that end?), so I forced 68,345 messages to flow to QM3 only, thereby raising it's seqno to 68,618.
Then, I repeated my original test, trying to round robin between a clusterQ defined to both QM2 and QM3.
Once again, all 100 messages went to QM3, even though the sequence numbers on the CLUSRCVR channels are the same!!!
Here was my original post back on page 1:
I have a cluster Queue (QueueA) that is defined on both QM2 and QM3. Bind option set to Not Fixed.
I have a COBOL program that is putting say 10 messages to QueueA. I specify MQOO-BIND-NOT-FIXED as an open option. The program issues an MQConn once, then for each message to be put it issues an MQOpen, MQPut and MQClose. Following the last message to be put, I issue an MQDisc. I would have expected 5 messages to appear on QM1's instance of QueueA and 5 to appear on QM2's instance of QueueA. _________________ Cheers,
Larry
MQ Certifiable |
|
Back to top |
|
 |
PeterPotkay |
Posted: Wed Sep 29, 2004 8:26 am Post subject: |
|
|
 Poobah
Joined: 15 May 2001 Posts: 7722
|
RatherBeGolfing wrote: |
I looked at the sequence numbers on my CLUSRCVR channels for my QM2 and QM3 managers. Sure enough, the seqno for QM2 was 68,618, the seqno for QM3 was 223. I couldn't figure out how to reset the sequence numbers (probably have to visit each QMgr who has a CLUSSDR to QM2 or QM3 and reset at that end?), so I forced 68,345 messages to flow to QM3 only, thereby raising it's seqno to 68,618. |
There is no way, no how, that an app should have to go thru something like this. And of course, when things are working right, they don't have to do this. (My point about how it can't be a straight compare of the current value of the sequence #)
Anyway, if it is still doing this, it is one of three things:
1. The app is coding the QM name in the MQOPEN call, or is asking for BIND_ON_OPEN (please post the code).
2. The queue is defined BIND_ON_OPEN (please post the queue definition).
3. You found a bug (what version of MQ and CSD are you at?). _________________ Peter Potkay
Keep Calm and MQ On |
|
Back to top |
|
 |
RatherBeGolfing |
Posted: Wed Sep 29, 2004 11:38 am Post subject: |
|
|
 Centurion
Joined: 12 Nov 2002 Posts: 118 Location: Syracuse, NY, USA
|
I believe I'm specifying blanks for the queue manager name and also bind not fixed on the open options. Sorry for the length of the post. I thought about chopping out comments and such from the program, but I may chop out something that is causing my problem!
Code: |
IDENTIFICATION DIVISION.
PROGRAM-ID.
IMP00028.
CLUSTR* THIS PROGRAM IS A CLONE OF IMP00008, EXCEPT FOR THE LOGIC
CLUSTR* OF OPEN OPTIONS - LINES MARKED CLUSTR IN COLS 1-6.
AUTHOR.
LARRY LACHANSE
DATE-WRITTEN.
JULY 27, 1998.
*REMARKS
*****************************************************************
* 1. THIS PROGRAM IS A COMMON "PUT" ROUTINE FOR APPLICATIONS WITH
* A NEED TO PLACE MESSAGES ONE AT A TIME ON AN MQ/SERIES QUEUE.
* THE PROGRAM HAS BEEN LINKED IN 3 "MODES" USING 3 DISTINCT
* MQ/SERIES STUB MODULES:
* LOAD MODULE IMPUTB01 USES STUB CSQBSTUB FOR MVS BATCH
* LOAD MODULE IMPUTC01 USES STUB CSQCSTUB FOR CICS ONLINE
* LOAD MODULE IMPUTI01 USES STUB CSQQSTUB FOR IMS/DC ONLINE
* ALL 3 LOAD MODULES HAVE THIS PROGRAM AS THEIR BASE, EACH ONE
* USING A UNIQUE ENTRY POINT. LINKAGE PARAMETERS CONTROL THE
* MQ/SERIES CALLS.
*
* 2. TO RUN THE PROGRAM, YOU NEED TO SUPPLY THE FOLLOWING VALUES
* VIA LINKAGE:
* --> ENVIRONMENT - 1 BYTE
* (VALUES: C FOR CICS, I FOR IMS, B FOR BATCH)
* --> QUEUE MANAGER NAME - 48 BYTES
* --> QUEUE NAME - 48 BYTES
* --> LENGTH OF INPUT DATA - 9 BYTES (MUST BE NUMERIC)
* (THIS LENGTH BECOMES MESSAGE LENGTH - THE PROGRAM PUTS
* MESSAGES UP TO A MAXIMUM LENGTH OF 64000 BYTES.)
* --> MESSAGE PERSISTENCE - 1 BYTE (MUST BE Y OR N)
* (PERSISTENT MESSAGES ARE WRITTEN TO BOTH LOGS AND DATA
* FILES. IF A QUEUE MANAGER IS RESTARTED AFTER A FAILURE,
* HE RECOVERS THESE PERSISTENT MESSAGES AS NECESSARY FROM
* THE LOGGED DATA. MESSAGES THAT ARE NOT PERSISTENT ARE
* DISCARDED IF A QUEUE MANAGER STOPS.)
* --> BATCH PROCESS CODE - 1 BYTE
* (NOTE: THIS CODE ONLY APPLIES TO APPLICATIONS
* WHICH CALL THIS PROGRAM USING THE BATCH ENTRY POINT)
* (VALUES: P - WILL PROCESS PUT, BUT NOT COMMIT MESSAGE
* C - WILL BYPASS PUT AND PROCESS COMMIT
* B - WILL BYPASS PUT AND PROCESS BACKOUT
* X - WILL PROCESS PUT AND COMMIT MESSAGE)
* --> MESSAGE ID - 24 BYTES
* (THIS FIELD, COMBINED WITH CORRELATION ID, ALLOW A UNIQUE
* 48 BYTE STRING TO BE STORED IN THE MESSAGE DESCRIPTOR
* PORTION OF THE MESSAGE ON THE QUEUE - NOT PART OF THE
* PHYSICAL MESSAGE, BUT SORT OF LIKE A PREFIX. IN CONCERT
* WITH THE CORRELATION ID (NEXT FIELD), IT WILL PROVIDE A
* UNIQUE "KEY" SO THAT PROGRAMS RETRIEVING MESSAGES FROM A
* COMMON QUEUE WILL KNOW WHICH ONE TO "GET").
* --> CORRELATION ID - 24 BYTES
* (THIS FIELD, COMBINED WITH MESSAGE ID, ALLOW A UNIQUE
* 48 BYTE STRING TO BE STORED IN THE MESSAGE DESCRIPTOR
* PORTION OF THE MESSAGE ON THE QUEUE - NOT PART OF THE
* PHYSICAL MESSAGE, BUT SORT OF LIKE A PREFIX. IN CONCERT
* WITH THE MESSAGE ID (PRIOR FIELD), IT WILL PROVIDE A
* UNIQUE "KEY" SO THAT PROGRAMS RETRIEVING MESSAGES FROM A
* COMMON QUEUE WILL KNOW WHICH ONE TO "GET").
* --> DATA PORTION OF THE MESSAGE - 64000 BYTES
* --> RETURN CODE - 2 BYTES (NUMERIC)
* --> RETURN ERROR MESSAGE - 50 BYTES
*
* 3. THE PROGRAM'S HIGH-LEVEL FLOW IS AS FOLLOWS:
* --> LINKAGE AREA IS BRIEFLY EXAMINED FOR ACCURACY
* --> CONNECTS TO THE QUEUE MANAGER
* --> OPENS THE QUEUE CONNECTION
* --> PUTS THE MESSAGE FOUND IN LINKAGE TO THE QUEUE
* --> COMMITS THE MESSAGE TO THE QUEUE, IF REQUESTED
* --> CLOSES THE QUEUE CONNECTION
* --> DISCONNECTS FROM THE QUEUE MANAGER
* --> RETURNS A CODE AND A MESSAGE TO THE CALLING MODULE
*
*****************************************************************
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-370.
OBJECT-COMPUTER. IBM-370.
INPUT-OUTPUT SECTION.
DATA DIVISION.
WORKING-STORAGE SECTION.
*
* WS00 - MISCELLANEOUS WORK FIELDS
*
01 FILLER PIC X(32) VALUE
'BEGIN WS00 MISC WORK FIELDS '.
01 WS00-INTERFACE-KEY PIC X(32) VALUE SPACES.
01 WS00-QMGR PIC X(48) VALUE SPACES.
01 WS00-DATA-FORMAT PIC X(8) VALUE 'MQSTR '.
01 WS00-MSGLENGTH PIC S9(9) COMP VALUE ZERO.
991001 01 WS00-MQ-REASON-SIGNED PIC S9(4) VALUE ZERO.
01 WS00-TYPE-OF-ERROR-CODE PIC 99 VALUE ZERO.
88 WS00-NO-ERRORS-FOUND VALUE ZERO.
01 WS00-FIRST-TIME-SW PIC X VALUE 'Y'.
88 WS00-FIRST-TIME VALUE 'Y'.
01 WS00-MSGBUFFER.
05 WS00-MSGBUFFER-ARRAY PIC X OCCURS 64000 TIMES.
990120 01 WS00-RETURN-MESSAGE.
991001 05 WS00-MQ-REASON PIC 9(4).
990120 05 FILLER PIC X VALUE ','.
990120 05 WS00-RETURN-TEXT PIC X(45).
*
* WS01 - LINKAGE FIELDS
*
01 FILLER PIC X(32) VALUE
'BEGIN WS01 LINKAGE FIELDS '.
01 WS01-ENVIRONMENT PIC X VALUE ' '.
01 WS01-QUEUE-MANAGER PIC X(48) VALUE ' '.
01 WS01-QUEUE-NAME PIC X(48) VALUE ' '.
01 WS01-MESSAGE-LENGTH PIC S9(9) VALUE +0 COMP.
01 WS01-MESSAGE-PERSISTENCE PIC X VALUE ' '.
01 WS01-BATCH-PROCESS-CD PIC X VALUE ' '.
01 WS01-MESSAGE-ID PIC X(24) VALUE ' '.
01 WS01-CORRELATION-ID PIC X(24) VALUE ' '.
01 WS01-MESSAGE-DATA PIC X(64000) VALUE ' '.
*
* WS02 - ERROR MESSAGES
*
01 FILLER PIC X(32) VALUE
'BEGIN WS02 ERROR MESSAGE TABLE '.
01 WS02-ERROR-MESSAGE-TABLE.
990120 05 FILLER PIC X(45) VALUE
01 'NON-NUMERIC VALUE PASSED IN MESSAGE LENGTH '.
990120 05 FILLER PIC X(45) VALUE
02 'VALUE OTHER THAN N OR Y FOUND IN PERSISTENCE '.
990120 05 FILLER PIC X(45) VALUE
03 'MQSERIES QUEUE CONNECT ERROR,CHECK Q MGR NAME'.
990120 05 FILLER PIC X(45) VALUE
04 'MQSERIES QUEUE OPEN ERROR, CHECK QUEUE NAME '.
990120 05 FILLER PIC X(45) VALUE
05 'MQSERIES QUEUE PUT ERROR '.
990120 05 FILLER PIC X(45) VALUE
06 'MQSERIES QUEUE COMMIT ERROR '.
990120 05 FILLER PIC X(45) VALUE
07 'MQSERIES QUEUE CLOSE ERROR '.
990120 05 FILLER PIC X(45) VALUE
08 'MQSERIES QUEUE DISCONNECT ERROR '.
990120 05 FILLER PIC X(45) VALUE
09 'VALUE OTHER THAN P,C,B,X IN BATCH PROCESS CD '.
990120 05 FILLER PIC X(45) VALUE
10 'VALUE OTHER THAN B,C,I FOUND IN ENVIRON FIELD'.
990120 05 FILLER PIC X(45) VALUE
11 '-->NOT CURRENTLY USED<-- '.
990120 05 FILLER PIC X(45) VALUE
12 '-->NOT CURRENTLY USED<-- '.
990120 05 FILLER PIC X(45) VALUE
13 '-->NOT CURRENTLY USED<-- '.
990120 05 FILLER PIC X(45) VALUE
14 '-->NOT CURRENTLY USED<-- '.
990120 05 FILLER PIC X(45) VALUE
15 '-->NOT CURRENTLY USED<-- '.
990120 05 FILLER PIC X(45) VALUE
16 '-->NOT CURRENTLY USED<-- '.
990120 05 FILLER PIC X(45) VALUE
17 '-->NOT CURRENTLY USED<-- '.
990120 05 FILLER PIC X(45) VALUE
18 '-->NOT CURRENTLY USED<-- '.
990120 05 FILLER PIC X(45) VALUE
19 '-->NOT CURRENTLY USED<-- '.
990120 05 FILLER PIC X(45) VALUE
20 '-->NOT CURRENTLY USED<-- '.
01 FILLER REDEFINES WS02-ERROR-MESSAGE-TABLE.
990120 05 WS02-ERROR-MESSAGE PIC X(45)
OCCURS 20 TIMES
INDEXED BY WS02-ERROR-INDEX.
*
* WS03 - API FIELDS - FOR MQ/SERIES CALLS
*
01 FILLER PIC X(32) VALUE
'BEGIN WS03 API FIELDS '.
01 WS03-HCONN PIC S9(9) BINARY VALUE 0.
01 WS03-HOBJ PIC S9(9) BINARY VALUE 0.
01 WS03-OPENOPTIONS PIC S9(9) BINARY.
01 WS03-COMPCODE PIC S9(9) BINARY.
01 WS03-REASON PIC S9(9) BINARY.
*
* MQ/SERIES - API CONTROL BLOCKS
*
01 FILLER PIC X(32) VALUE
'BEGIN MQM-OBJECT-DESCRIPTOR '.
01 MQM-OBJECT-DESCRIPTOR.
COPY CMQODV.
01 FILLER PIC X(32) VALUE
'BEGIN MQM-MESSAGE-DESCRIPTOR '.
01 MQM-MESSAGE-DESCRIPTOR.
COPY CMQMDV.
01 FILLER PIC X(32) VALUE
'BEGIN MQM-PUT-MESSAGE-OPTIONS '.
01 MQM-PUT-MESSAGE-OPTIONS.
COPY CMQPMOV.
01 FILLER PIC X(32) VALUE
'BEGIN MQM-CONSTANTS '.
01 MQM-CONSTANTS.
COPY CMQV SUPPRESS.
LINKAGE SECTION.
01 LS1-LINKAGE-AREA.
05 LS1-ENVIRONMENT PIC X.
05 LS1-QUEUE-MANAGER PIC X(48).
05 LS1-QUEUE-NAME PIC X(48).
05 LS1-MESSAGE-LENGTH PIC 9(9).
05 LS1-PERSISTENCE-IND PIC X.
05 LS1-BATCH-PROCESS-CD PIC X.
05 LS1-MESSAGE-ID PIC X(24).
05 LS1-CORRELATION-ID PIC X(24).
05 LS1-MESSAGE-DATA PIC X(64000).
05 LS1-RETURN-CODE PIC 99.
05 LS1-RETURN-MESSAGE PIC X(50).
PROCEDURE DIVISION.
MODULE-OVERVIEW.
ENTRY 'IMPUTB28' USING LS1-LINKAGE-AREA.
PERFORM A000-INITIALIZATION
THRU A000-INITIALIZATION-EXIT.
*****************************************************************
* NOTE1: IF WE'RE RUNNING IN BATCH MODE AND THE BATCH PROCESS
*--> CODE IS SET TO 'C', THEN THE PROGRAM PERFORMS A
* ROUTINE TO COMMIT THE PENDING MESSAGES TO THE QUEUE,
* BYPASSING THE PUT PROCESSING. IN THIS CASE, IT ASSUMES
* THE CALLING PROGRAM IS AT END-OF-FILE OR AT A CHECKPOINT
* AND DOES NOT HAVE A MESSAGE TO PUT WITH THIS CALL.
*--> IF THE CODE IS SET TO 'B', THE PROGRAM PERFORMS
* A BACKOUT CALL, AGAIN BYPASSING THE PUT LOGIC.
*--> IF THE CODE IS SET TO 'P', THE PROGRAM PERFORMS
* THE PUT CALL ONLY WITH NO COMMIT.
*--> IF THE CODE IS SET TO 'X', THE PROGRAM PERFORMS
* THE PUT CALL AND THEN COMMITS THE MESSAGE.
* NOTE2: MQ/SERIES COMMITS ARE NOT SUPPORTED IN CICS OR IMS.
*****************************************************************
IF WS00-NO-ERRORS-FOUND
IF WS01-ENVIRONMENT = 'B'
EVALUATE WS01-BATCH-PROCESS-CD
WHEN 'P'
PERFORM D000-PROCESS-MESSAGES
THRU D000-PROCESS-MESSAGES-EXIT
WHEN 'C'
PERFORM N300-QUEUE-COMMIT
THRU N300-QUEUE-COMMIT-EXIT
WHEN 'B'
PERFORM N350-QUEUE-BACKOUT
THRU N350-QUEUE-BACKOUT-EXIT
WHEN 'X'
PERFORM D000-PROCESS-MESSAGES
THRU D000-PROCESS-MESSAGES-EXIT
000120* IF THE PUT FAILS, WE DON'T WANT TO MASK THE MQ REASON CODE
000120* BY PERFORMING THE COMMIT CALL, SO WE BYPASS THE COMMIT.
000120 IF WS00-NO-ERRORS-FOUND
PERFORM N300-QUEUE-COMMIT
THRU N300-QUEUE-COMMIT-EXIT
000120 END-IF
END-EVALUATE
ELSE
PERFORM D000-PROCESS-MESSAGES
THRU D000-PROCESS-MESSAGES-EXIT
END-IF
END-IF.
CLUSTR IF WS00-NO-ERRORS-FOUND
CLUSTR IF WS01-ENVIRONMENT = 'B'
CLUSTR CONTINUE
*****************************************************************
* NOTE1: IF WE'RE RUNNING IN BATCH MODE WE NEVER PERFORM THE
* A300 TERMINATION ROUTINE TO CLOSE THE QUEUE CONNECTION
* AND DISCONNECT FROM THE QUEUE MANAGER.
* THE REASON: DURING NORMAL RECORD PROCESSING, WE DON'T
* WANT TO CLOSE/DISCONNECT SINCE THE EXPECTATION IS THAT
* THERE WILL BE MORE MESSAGES COMING. IF THE CALLING BATCH
* PROGRAM SENDS A PROCESS CODE OF 'C', IT MAY BE JUST
* DOING A COMMIT AS PART OF CHECKPOINT PROCESSING AND,
* AGAIN, WE'LL HAVE MORE RECORDS TO PROCESS. IF THERE
* ARE NO MORE RECORDS/MESSAGES, THEN THE PROGRAM WILL END
* NORMALLY AND AN IMPLICIT COMMIT/CLOSE/DISCONNECT WILL
* OCCUR. IF THE CALLING BATCH PROGRAM SENDS A BATCH
* PROCESS CODE OF 'B' FOR ROLLBACK, IT STILL MAY CONTINUE
* TO SEND MESSAGES, BUT, IF NOT, THE IMPLICIT CLOSE AND
* DISCONNECT WILL AGAIN BE INVOKED.
*
* BOTTOM LINE: WHEN A BATCH PROGAM INVOKES THIS CALLED
* ROUTINE:
* CONNECT AND OPEN CALLS ARE PERFORMED ONCE
* A PUT IS PERFORMED FOR EACH RECORD PASSED
* COMMIT IS ISSUED IF SO INSTRUCTED
* ROLLBACK IS ISSUED IF SO INSTRUCTED
* CLOSE AND DISCONNNECT ARE NEVER EXPLICITLY PERFORMED
*****************************************************************
CLUSTR ELSE
CLUSTR PERFORM A300-TERMINATION
CLUSTR THRU A300-TERMINATION-EXIT
CLUSTR END-IF
CLUSTR END-IF.
MOVE WS00-TYPE-OF-ERROR-CODE TO LS1-RETURN-CODE.
IF WS00-NO-ERRORS-FOUND
MOVE SPACES TO LS1-RETURN-MESSAGE
ELSE
SET WS02-ERROR-INDEX TO WS00-TYPE-OF-ERROR-CODE
MOVE WS02-ERROR-MESSAGE (WS02-ERROR-INDEX)
990120 TO WS00-RETURN-TEXT
991001 MOVE WS03-REASON TO WS00-MQ-REASON-SIGNED
991001 MOVE WS00-MQ-REASON-SIGNED TO WS00-MQ-REASON
990120 MOVE WS00-RETURN-MESSAGE TO LS1-RETURN-MESSAGE
END-IF.
MODULE-OVERVIEW-EXIT.
GOBACK.
A000-INITIALIZATION.
*****************************************************************
* THIS PARAGRAPH:
* (1) VALIDATES LINKAGE PARAMETERS.
* (2) SETS UP MQSERIES VARIABLES.
*****************************************************************
MOVE ZERO TO WS00-TYPE-OF-ERROR-CODE.
IF (LS1-ENVIRONMENT = 'B') OR
(LS1-ENVIRONMENT = 'C') OR
(LS1-ENVIRONMENT = 'I')
MOVE LS1-ENVIRONMENT TO WS01-ENVIRONMENT
ELSE
MOVE 10 TO WS00-TYPE-OF-ERROR-CODE
GO TO A000-INITIALIZATION-EXIT
END-IF.
CLUSTR MOVE SPACES TO WS01-QUEUE-MANAGER.
MOVE LS1-QUEUE-NAME TO WS01-QUEUE-NAME.
IF LS1-MESSAGE-LENGTH NUMERIC
MOVE LS1-MESSAGE-LENGTH TO WS01-MESSAGE-LENGTH
ELSE
MOVE 01 TO WS00-TYPE-OF-ERROR-CODE
GO TO A000-INITIALIZATION-EXIT
END-IF.
IF (LS1-PERSISTENCE-IND = 'N') OR
(LS1-PERSISTENCE-IND = 'Y')
MOVE LS1-PERSISTENCE-IND TO WS01-MESSAGE-PERSISTENCE
ELSE
MOVE 02 TO WS00-TYPE-OF-ERROR-CODE
GO TO A000-INITIALIZATION-EXIT
END-IF.
IF WS01-ENVIRONMENT = 'B'
IF (LS1-BATCH-PROCESS-CD = 'P') OR
(LS1-BATCH-PROCESS-CD = 'C') OR
(LS1-BATCH-PROCESS-CD = 'B') OR
(LS1-BATCH-PROCESS-CD = 'X')
MOVE LS1-BATCH-PROCESS-CD TO WS01-BATCH-PROCESS-CD
ELSE
MOVE 09 TO WS00-TYPE-OF-ERROR-CODE
GO TO A000-INITIALIZATION-EXIT
END-IF
END-IF.
MOVE LS1-MESSAGE-ID TO WS01-MESSAGE-ID.
MOVE LS1-CORRELATION-ID TO WS01-CORRELATION-ID.
MOVE LS1-MESSAGE-DATA TO WS01-MESSAGE-DATA.
*
TEMP * DISPLAY ' '.
TEMP * DISPLAY 'IN PROGRAM IMP00028, PARAGRAPH A000'.
TEMP * DISPLAY '--> LINKAGE FIELDS AFTER MOVES TO WS01...'.
TEMP * DISPLAY ' WS01-ENVIRONMENT------ ' WS01-ENVIRONMENT.
TEMP * DISPLAY ' WS01-QUEUE-MANAGER---- ' WS01-QUEUE-MANAGER.
TEMP * DISPLAY ' WS01-QUEUE-NAME------- ' WS01-QUEUE-NAME.
TEMP * DISPLAY ' WS01-MESSAGE-LENGTH--- ' WS01-MESSAGE-LENGTH.
TEMP * DISPLAY ' WS01-MESSAGE-PERSIST-- ' WS01-MESSAGE-PERSISTENCE.
TEMP * DISPLAY ' WS01-BATCH-PROCESS-CD- ' WS01-BATCH-PROCESS-CD.
TEMP * DISPLAY ' WS01-MESSAGE-ID------- ' WS01-MESSAGE-ID.
TEMP * DISPLAY ' WS01-CORRELATION-ID--- ' WS01-CORRELATION-ID.
TEMP * DISPLAY ' WS01-MESSAGE-DATA----- ' WS01-MESSAGE-DATA.
TEMP * DISPLAY ' '.
************************************************************************
********** SETUP MQSERIES VARIABLES AND PERFORM MQSERIES PREP
************************************************************************
IF WS01-MESSAGE-PERSISTENCE = 'Y'
MOVE MQPER-PERSISTENT TO MQMD-PERSISTENCE
ELSE
MOVE MQPER-NOT-PERSISTENT TO MQMD-PERSISTENCE
END-IF.
************************************************************************
********** CONNECT TO THE QUEUE MANAGER
********** NOTE1: CICS APPLICATIONS DO NOT NEED TO CONNECT TO THE QUEUE
********** MANAGER, BECAUSE CICS ITSELF IS CONNECTED. THE CALL
********** IS SKIPPED HERE, BECAUSE IN A CICS ENVIRONMENT
********** THE CALL IS ALWAYS SUCCESSFUL. THIS MEANS THAT THE
********** RETURN CODE MAY NOT REFLECT THE TRUE STATE OF THE
********** CONNECTION TO THE QUEUE MANAGER.
********** NOTE2: BATCH APPLICATIONS WILL MORE THAN LIKELY INVOKE THIS
********** PROGRAM AS THEY LOOP THROUGH THEIR INPUT FILE(S).
********** AS SUCH, I SET UP A FIRST TIME SWITCH TO AVOID
********** REPETITIVE CONNECTION AND OPEN CALLS TO THE QUEUE
********** MANAGER. THE SWITCH IS RESET AFTER THE QUEUE
********** CONNECTION IS SUCCESFULLY OPENED.
************************************************************************
IF WS01-ENVIRONMENT = 'C'
CONTINUE
ELSE
IF WS01-ENVIRONMENT = 'I'
PERFORM N100-CONNECT-QUEUE
THRU N100-CONNECT-QUEUE-EXIT
ELSE
CLUSTR IF (WS01-ENVIRONMENT = 'B') AND (WS00-FIRST-TIME)
PERFORM N100-CONNECT-QUEUE
THRU N100-CONNECT-QUEUE-EXIT
END-IF
END-IF
END-IF.
IF WS00-NO-ERRORS-FOUND
CONTINUE
ELSE
GO TO A000-INITIALIZATION-EXIT
END-IF.
************************************************************************
********** OPEN THE QUEUE CONNECTION. WHEN RUNNING IN BATCH MODE, ON
********** THE FIRST SUCCESSFUL OPEN, I TURN OFF THE FIRST TIME SWITCH.
************************************************************************
IF (WS01-ENVIRONMENT = 'C') OR (WS01-ENVIRONMENT = 'I')
PERFORM N200-OPEN-QUEUE
THRU N200-OPEN-QUEUE-EXIT
ELSE
IF (WS01-ENVIRONMENT = 'B') AND (WS00-FIRST-TIME)
MOVE 'N' TO WS00-FIRST-TIME-SW
PERFORM N200-OPEN-QUEUE
THRU N200-OPEN-QUEUE-EXIT
END-IF
END-IF.
IF WS00-NO-ERRORS-FOUND
CONTINUE
ELSE
GO TO A000-INITIALIZATION-EXIT
END-IF.
*
* SETUP MQSERIES VARIABLES
* 3) SET PMO OPTIONS
*
COMPUTE MQPMO-OPTIONS = MQPMO-SYNCPOINT.
A000-INITIALIZATION-EXIT.
EXIT.
A300-TERMINATION.
************************************************************************
********** CLOSE THE QUEUE CONNECTION
************************************************************************
PERFORM N400-CLOSE-QUEUE
THRU N400-CLOSE-QUEUE-EXIT.
IF WS00-NO-ERRORS-FOUND
CONTINUE
ELSE
GO TO A300-TERMINATION-EXIT
END-IF.
************************************************************************
********** DISCONNECT FROM THE QUEUE MANAGER
********** NOTE: CICS APPLICATIONS DO NOT NEED TO DISCONNECT FROM THE
********** QUEUE MANAGER, BECAUSE CICS ITSELF IS CONTINUALLY
********** CONNECTED.
********** THE CALL IS SKIPPED HERE, BECAUSE IN A CICS ENVIRONMENT
********** THE CALL IS ALWAYS SUCCESSFUL. THIS MEANS THAT THE
********** RETURN CODE MAY NOT REFLECT THE TRUE STATE OF THE
********** DIS-CONNECTION TO THE QUEUE MANAGER.
************************************************************************
IF WS01-ENVIRONMENT = 'C'
CONTINUE
ELSE
PERFORM N500-DISCONNECT-QUEUE
THRU N500-DISCONNECT-QUEUE-EXIT
END-IF.
IF WS00-NO-ERRORS-FOUND
CONTINUE
ELSE
GO TO A300-TERMINATION-EXIT
END-IF.
A300-TERMINATION-EXIT.
EXIT.
D000-PROCESS-MESSAGES.
MOVE WS01-MESSAGE-DATA TO WS00-MSGBUFFER.
MOVE WS01-MESSAGE-LENGTH TO WS00-MSGLENGTH.
*
* SETUP THE MESSAGE DESCRIPTOR (MQMD)
*
IF WS01-MESSAGE-ID = SPACES
MOVE MQMI-NONE TO MQMD-MSGID
ELSE
MOVE WS01-MESSAGE-ID TO MQMD-MSGID
END-IF.
IF WS01-CORRELATION-ID = SPACES
MOVE MQCI-NONE TO MQMD-CORRELID
ELSE
MOVE WS01-CORRELATION-ID TO MQMD-CORRELID
END-IF.
MOVE WS00-DATA-FORMAT TO MQMD-FORMAT.
CALL 'MQPUT' USING WS03-HCONN
WS03-HOBJ
MQMD
MQPMO
WS00-MSGLENGTH
WS00-MSGBUFFER
WS03-COMPCODE
WS03-REASON.
IF WS03-COMPCODE NOT = MQCC-OK
MOVE 05 TO WS00-TYPE-OF-ERROR-CODE
GO TO D000-PROCESS-MESSAGES-EXIT
TEMP ELSE
TEMP DISPLAY 'MQPUT SUCCESSFUL'
END-IF.
D000-PROCESS-MESSAGES-EXIT.
EXIT.
N100-CONNECT-QUEUE.
*
* CONNECT TO THE QUEUE MANAGER
*
MOVE WS01-QUEUE-MANAGER TO WS00-QMGR.
CLUSTR DISPLAY 'WS00-QMGR = ' WS00-QMGR.
CALL 'MQCONN' USING WS00-QMGR
WS03-HCONN
WS03-COMPCODE
WS03-REASON.
IF (WS03-COMPCODE NOT = MQCC-OK)
MOVE 03 TO WS00-TYPE-OF-ERROR-CODE
TEMP DISPLAY ' '
TEMP DISPLAY '/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/'
TEMP DISPLAY 'IN IMP00028 MQCONN NOT SUCCESSFUL'
TEMP DISPLAY '--- WS03-COMPCODE = ' WS03-COMPCODE
TEMP DISPLAY '--- WS03-REASON = ' WS03-REASON
TEMP DISPLAY '/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/'
TEMP DISPLAY ' '
TEMP ELSE
TEMP DISPLAY 'MQCONN SUCCESSFUL'
END-IF.
N100-CONNECT-QUEUE-EXIT.
EXIT.
N200-OPEN-QUEUE.
*
* OPEN THE QUEUE FOR PUT PROCESSING
*
COMPUTE WS03-OPENOPTIONS = MQOO-OUTPUT +
CLUSTR MQOO-BIND-NOT-FIXED.
CLUSTR MOVE SPACES TO MQOD-OBJECTQMGRNAME
MOVE WS01-QUEUE-NAME TO MQOD-OBJECTNAME.
CALL 'MQOPEN' USING WS03-HCONN
MQOD
WS03-OPENOPTIONS
WS03-HOBJ
WS03-COMPCODE
WS03-REASON.
IF (WS03-COMPCODE NOT = MQCC-OK)
MOVE 04 TO WS00-TYPE-OF-ERROR-CODE
TEMP ELSE
TEMP DISPLAY 'MQOPEN SUCCESSFUL'
END-IF.
N200-OPEN-QUEUE-EXIT.
EXIT.
N300-QUEUE-COMMIT.
************************************************************************
********** ONLY PERFORM THE COMMIT CALL IF WE'RE RUNNING IN A BATCH
********** ENVIRONMENT, SINCE MQCMIT IS NOT SUPPORTED IN IMS/DC OR CICS.
********** ALSO, THE CALLING BATCH PROGRAM MUST SPECIFY A BATCH PROCESS
********** CODE OF 'C' OR 'X' IN ORDER TO COMMIT. THE CALLING PROGRAM
********** WOULD LIKELY SEND A 'C' WHEN IT ENCOUNTERS END-OF-FILE,
********** BUT IT MAY ALSO CONTAIN CHECKPOINT LOGIC. IT MAY CHOOSE TO
********** SEND AN 'X' TO COMMIT WITH EACH MESSAGE PUT.
************************************************************************
CALL 'MQCMIT' USING WS03-HCONN
WS03-COMPCODE
WS03-REASON.
IF (WS03-COMPCODE NOT = MQCC-OK)
MOVE 06 TO WS00-TYPE-OF-ERROR-CODE
TEMP ELSE
TEMP DISPLAY 'MQCMIT SUCCESSFUL'
END-IF.
N300-QUEUE-COMMIT-EXIT.
EXIT.
N350-QUEUE-BACKOUT.
CALL 'MQBACK' USING WS03-HCONN
WS03-COMPCODE
WS03-REASON.
IF (WS03-COMPCODE NOT = MQCC-OK)
MOVE 10 TO WS00-TYPE-OF-ERROR-CODE
TEMP ELSE
TEMP DISPLAY 'MQBACK SUCCESSFUL'
END-IF.
N350-QUEUE-BACKOUT-EXIT.
EXIT.
N400-CLOSE-QUEUE.
******************************************************************
* CLOSE THE QUEUE
******************************************************************
CALL 'MQCLOSE' USING WS03-HCONN
WS03-HOBJ
MQCO-NONE
WS03-COMPCODE
WS03-REASON.
IF (WS03-COMPCODE NOT = MQCC-OK)
MOVE 07 TO WS00-TYPE-OF-ERROR-CODE
TEMP ELSE
TEMP DISPLAY 'MQCLOSE SUCCESSFUL'
END-IF.
N400-CLOSE-QUEUE-EXIT.
EXIT.
N500-DISCONNECT-QUEUE.
******************************************************************
* DISCONNECT FROM THE QUEUE MANAGER
******************************************************************
CALL 'MQDISC' USING WS03-HCONN
WS03-COMPCODE
WS03-REASON.
IF (WS03-COMPCODE NOT = MQCC-OK)
MOVE 08 TO WS00-TYPE-OF-ERROR-CODE
TEMP ELSE
TEMP DISPLAY 'MQDISC SUCCESSFUL'
END-IF.
N500-DISCONNECT-QUEUE-EXIT.
EXIT.
|
The queue is defined on both target queue managers with Bind option of not fixed:
Code: |
DEFINE QLOCAL ('LARRY.TESTQ2') +
* CRDATE (2003-11-13) +
* CRTIME (15.14.56) +
* ALTDATE (2003-11-13) +
* ALTTIME (15.14.56) +
DESCR(' ') +
PUT(ENABLED) +
DEFPRTY(0) +
DEFPSIST(NO) +
SCOPE(QMGR) +
GET(ENABLED) +
MAXDEPTH(5000) +
MAXMSGL(4194304) +
SHARE +
DEFSOPT(SHARED) +
MSGDLVSQ(PRIORITY) +
HARDENBO +
USAGE(NORMAL) +
NOTRIGGER +
TRIGTYPE(FIRST) +
TRIGDPTH(1) +
TRIGMPRI(0) +
TRIGDATA(' ') +
PROCESS(' ') +
INITQ(' ') +
RETINTVL(999999999) +
BOTHRESH(0) +
BOQNAME(' ') +
QDEPTHHI(80) +
QDEPTHLO(20) +
QDPMAXEV(ENABLED) +
QDPHIEV(DISABLED) +
QDPLOEV(DISABLED) +
QSVCINT(999999999) +
QSVCIEV(NONE) +
DISTL(NO) +
NPMCLASS(NORMAL) +
CLUSTER('DAASSTT') +
CLUSNL(' ') +
DEFBIND(NOTFIXED) +
REPLACE
|
If I PUT inhibit this Q on my QM3, all the messages do flow to QM2, so I know MQ can make the connection there. He just always seems to favor QM3 as a destination.
Also, I'm running MQ 5.3 on all platforms, have applied CSD06 on the Windows machines (which host QM2 and QM3). _________________ Cheers,
Larry
MQ Certifiable |
|
Back to top |
|
 |
PeterPotkay |
Posted: Wed Sep 29, 2004 5:31 pm Post subject: |
|
|
 Poobah
Joined: 15 May 2001 Posts: 7722
|
The code and queues look OK.
That fact that the messages go to QM2 when you PUT_INHIBIT the queue on QM3 eliminates the app coding QM3 in the OnjectQueueManager filed. If it was doing that, the messages would still try and go to QM3 even after you PUT_INHIBITED the queue (DLQ or S.C.T.Q. until the Q was available can't remember(to lazy/tired to test this now)).
So its either the BIND_ON_OPEN, or a custom CLuster WorkLoad Exit someone snuck in on you, or a bug.
Hate to say it, it may be time to fire up strmqtrc -t all -t detail, run your tests, and send the trace files to IBM. Since you are 5.3 CSD06, I would expect clustering to work pretty well, and not like you are describing. Unless there is a detail you are leving out, it looks like something is not working properly. _________________ Peter Potkay
Keep Calm and MQ On |
|
Back to top |
|
 |
RatherBeGolfing |
Posted: Thu Sep 30, 2004 4:52 am Post subject: |
|
|
 Centurion
Joined: 12 Nov 2002 Posts: 118 Location: Syracuse, NY, USA
|
Peter, and all others who participated in this chat - Thank you!
I'm sure that I'm using Bind NotFixed everywhere I need to and I'm also positive there are no workload exits in our environment.
The only other detail I could mention is that I have other queue managers participating in this same cluster. I chose 2 of the others, created another clustered Q on each of them and reran my PUT program from z/OS. They performed the round-robin-dance perfectly. So, perhaps it is environmentally related to the 2 QMgrs I really want to PUT to. These 2 QMgrs that don't work, share their servers with WMQI (V2.1) software - perhaps something in there or it's CSD04 updates affected MQ's behaviour??
Anyway, I'll open a PMR with IBM and post the results here.
Thanks again! _________________ Cheers,
Larry
MQ Certifiable |
|
Back to top |
|
 |
PeterPotkay |
Posted: Thu Sep 30, 2004 4:54 am Post subject: |
|
|
 Poobah
Joined: 15 May 2001 Posts: 7722
|
We have one of our clusters at 5.3 CSD04 on Windows running WMQI 2.1 CSD05 brokers as well. No problems.
Interested to hear the results of the PMR. _________________ Peter Potkay
Keep Calm and MQ On |
|
Back to top |
|
 |
Nigelg |
Posted: Thu Sep 30, 2004 11:58 pm Post subject: |
|
|
Grand Master
Joined: 02 Aug 2004 Posts: 1046
|
I have one other thought. Is it possible that the qmgr that the msgs will not go to is suspended from the cluster? This would cause the msgs to go the other qmgr unless the dest queue is PUT inhibited.
You can check this by the mqsc command DIS CLUSQMGR(QMGR) ALL. THe SUSPEND attribute will be set to YES if it is suspended.
You can resume the qmgr in the cluster with the RESUME QMGR mqsc command. |
|
Back to top |
|
 |
RatherBeGolfing |
Posted: Fri Oct 01, 2004 9:10 am Post subject: |
|
|
 Centurion
Joined: 12 Nov 2002 Posts: 118 Location: Syracuse, NY, USA
|
None of the QMgrs involved in this testing are suspended from the cluster. Thanks for the thought though.... _________________ Cheers,
Larry
MQ Certifiable |
|
Back to top |
|
 |
PeterPotkay |
Posted: Fri Oct 01, 2004 10:26 am Post subject: |
|
|
 Poobah
Joined: 15 May 2001 Posts: 7722
|
The destination QM may not say SUSPENDED, but the sending QM may incorrectly think it is in its repository.
You will have to use the amqrfdm utility to parse the data in the sending QM's repository queue. It is possible if the destination QM at 1 time was suspended, that fact may be incorrectly left over in places. _________________ Peter Potkay
Keep Calm and MQ On |
|
Back to top |
|
 |
RatherBeGolfing |
Posted: Fri Oct 01, 2004 11:14 am Post subject: |
|
|
 Centurion
Joined: 12 Nov 2002 Posts: 118 Location: Syracuse, NY, USA
|
Is there a z/OS equivalent command for the amqrfdm utility? My sending QMGR is MQ V5.3.1 on z/OS. _________________ Cheers,
Larry
MQ Certifiable |
|
Back to top |
|
 |
PeterPotkay |
Posted: Sat Oct 02, 2004 12:10 pm Post subject: |
|
|
 Poobah
Joined: 15 May 2001 Posts: 7722
|
Larry, I don't know. I have to assume IBM does have something to look at the cluster info on a z/OS QM. Whether its that program or something else.....
If you opened a PMR, I'm sure you'll learn how (let us know!). _________________ Peter Potkay
Keep Calm and MQ On |
|
Back to top |
|
 |
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|
|
|