Author |
Message
|
mqprimerib |
Posted: Thu Oct 27, 2016 10:32 am Post subject: 2 FRs, can only put to 1 of them? |
|
|
Apprentice
Joined: 30 Mar 2016 Posts: 36 Location: Detroit Rock City
|
So I have 2 FRs, each one is on 2 different hosts. I have my CLUS sdr and rcv pairs working fine. By that, I mean I can:
DEFINE QLOCAL(Q.OB.IDVREQUEST) CLUSTER(IF14CLUS)
on one of the cluster QMs and the definition shows up on the other QM.
I can put a msg on one QM and I can get the msg from the other QM. Aweseom!
But when I try it the reverse way, put to the other QM, I can't refresh the remote queue. MQ Visual Edit complains that it is a remote queue and I can ONLY put messages.
I thought since both QMs were a FR in the cluster, I could put to both and see the msg on both QMs in the cluster. Did I misunderstand the concept?
My config:
Machine 1:
Quote: |
display chstatus(*)
95 : display chstatus(*)
AMQ8417: Display Channel Status details.
CHANNEL(TO.QM.IF14.2.TSTINT) CHLTYPE(CLUSSDR)
CONNAME(192.168.11.78(6538)) CURRENT
RQMNAME(QM.IF14.2.TSTINT) STATUS(RUNNING)
SUBSTATE(MQGET) XMITQ(SYSTEM.CLUSTER.TRANSMIT.QUEUE)
AMQ8417: Display Channel Status details.
CHANNEL(TO.QM.IF14.1.TSTINT) CHLTYPE(CLUSRCVR)
CONNAME(192.168.11.7 CURRENT
RQMNAME(QM.IF14.2.TSTINT) STATUS(RUNNING)
SUBSTATE(RECEIVE)
display clusqmgr(*) qmtype
96 : display clusqmgr(*) qmtype
AMQ8441: Display Cluster Queue Manager details.
CLUSQMGR(QM.IF14.1.TSTINT) CHANNEL(TO.QM.IF14.1.TSTINT)
CLUSTER(IF14CLUS) QMTYPE(REPOS)
AMQ8441: Display Cluster Queue Manager details.
CLUSQMGR(QM.IF14.2.TSTINT) CHANNEL(TO.QM.IF14.2.TSTINT)
CLUSTER(IF14CLUS) QMTYPE(REPOS)
dis clusqmgr(*)
97 : dis clusqmgr(*)
AMQ8441: Display Cluster Queue Manager details.
CLUSQMGR(QM.IF14.1.TSTINT) CHANNEL(TO.QM.IF14.1.TSTINT)
CLUSTER(IF14CLUS)
AMQ8441: Display Cluster Queue Manager details.
CLUSQMGR(QM.IF14.2.TSTINT) CHANNEL(TO.QM.IF14.2.TSTINT)
CLUSTER(IF14CLUS)
dis chstatus(*)
98 : dis chstatus(*)
AMQ8417: Display Channel Status details.
CHANNEL(TO.QM.IF14.2.TSTINT) CHLTYPE(CLUSSDR)
CONNAME(192.168.11.78(6538)) CURRENT
RQMNAME(QM.IF14.2.TSTINT) STATUS(RUNNING)
SUBSTATE(MQGET) XMITQ(SYSTEM.CLUSTER.TRANSMIT.QUEUE)
AMQ8417: Display Channel Status details.
CHANNEL(TO.QM.IF14.1.TSTINT) CHLTYPE(CLUSRCVR)
CONNAME(192.168.11.7 CURRENT
RQMNAME(QM.IF14.2.TSTINT) STATUS(RUNNING)
SUBSTATE(RECEIVE)
|
Machine 2:
Code: |
display chstatus(*)
21 : display chstatus(*)
AMQ8417: Display Channel Status details.
CHANNEL(TO.QM.IF14.2.TSTINT) CHLTYPE(CLUSRCVR)
CONNAME(192.168.11.77) CURRENT
RQMNAME(QM.IF14.1.TSTINT) STATUS(RUNNING)
SUBSTATE(RECEIVE)
AMQ8417: Display Channel Status details.
CHANNEL(TO.QM.IF14.1.TSTINT) CHLTYPE(CLUSSDR)
CONNAME(192.168.11.77(6536)) CURRENT
RQMNAME(QM.IF14.1.TSTINT) STATUS(RUNNING)
SUBSTATE(MQGET) XMITQ(SYSTEM.CLUSTER.TRANSMIT.QUEUE)
display clusqmgr(*) qmtype
22 : display clusqmgr(*) qmtype
AMQ8441: Display Cluster Queue Manager details.
CLUSQMGR(QM.IF14.1.TSTINT) CHANNEL(TO.QM.IF14.1.TSTINT)
CLUSTER(IF14CLUS) QMTYPE(REPOS)
AMQ8441: Display Cluster Queue Manager details.
CLUSQMGR(QM.IF14.2.TSTINT) CHANNEL(TO.QM.IF14.2.TSTINT)
CLUSTER(IF14CLUS) QMTYPE(REPOS)
dis clusqmgr(*)
23 : dis clusqmgr(*)
AMQ8441: Display Cluster Queue Manager details.
CLUSQMGR(QM.IF14.1.TSTINT) CHANNEL(TO.QM.IF14.1.TSTINT)
CLUSTER(IF14CLUS)
AMQ8441: Display Cluster Queue Manager details.
CLUSQMGR(QM.IF14.2.TSTINT) CHANNEL(TO.QM.IF14.2.TSTINT)
CLUSTER(IF14CLUS)
dis chstatus(*)
24 : dis chstatus(*)
AMQ8417: Display Channel Status details.
CHANNEL(TO.QM.IF14.2.TSTINT) CHLTYPE(CLUSRCVR)
CONNAME(192.168.11.77) CURRENT
RQMNAME(QM.IF14.1.TSTINT) STATUS(RUNNING)
SUBSTATE(RECEIVE)
AMQ8417: Display Channel Status details.
CHANNEL(TO.QM.IF14.1.TSTINT) CHLTYPE(CLUSSDR)
CONNAME(192.168.11.77(6536)) CURRENT
RQMNAME(QM.IF14.1.TSTINT) STATUS(RUNNING)
SUBSTATE(MQGET) XMITQ(SYSTEM.CLUSTER.TRANSMIT.QUEUE) |
|
|
Back to top |
|
|
mqjeff |
Posted: Thu Oct 27, 2016 10:37 am Post subject: |
|
|
Grand Master
Joined: 25 Jun 2008 Posts: 17447
|
Whether or not a queue is in a cluster or not, whether it's on a PR or an FR or not.
You can never get from a queue that is not a QLOCAL on the queue manager you are connected to. _________________ chmod -R ugo-wx / |
|
Back to top |
|
|
Vitor |
Posted: Thu Oct 27, 2016 11:07 am Post subject: Re: 2 FRs, can only put to 1 of them? |
|
|
Grand High Poobah
Joined: 11 Nov 2005 Posts: 26093 Location: Texas, USA
|
mqprimerib wrote: |
But when I try it the reverse way, put to the other QM, I can't refresh the remote queue. MQ Visual Edit complains that it is a remote queue and I can ONLY put messages. |
If you've got a remote queue in a cluster set up, you're doing it wrong.
mqprimerib wrote: |
I thought since both QMs were a FR in the cluster, I could put to both and see the msg on both QMs in the cluster. Did I misunderstand the concept? |
Yes. A message only ever exists on one queue manager in a cluster. It's on a local queue hosted by that queue manager. The cluster works out which queue manager that's going to be. You explained very well in your other post here:
mqprimerib wrote: |
In the rare instance of a QM failure, the messages will remain queued and can be recovered when the queue manager comes back online |
A remote queue is a specific object type with a specific purpose. It's not some kind of alias to a queue on a different queue manager that you can get from.
To achieve what you're describing (put a message from any queue manager, get that message from any queue manager) then you need to implement a queue sharing group. To do that, you need a mainframe because z/OS is the only OS which supports it, for good and sufficient reason. _________________ Honesty is the best policy.
Insanity is the best defence. |
|
Back to top |
|
|
exerk |
Posted: Thu Oct 27, 2016 2:41 pm Post subject: Re: 2 FRs, can only put to 1 of them? |
|
|
Jedi Council
Joined: 02 Nov 2006 Posts: 6339
|
Vitor wrote: |
Yes. A message only ever exists on one queue manager in a cluster. |
Caveat: Pub/Sub _________________ It's puzzling, I don't think I've ever seen anything quite like this before...and it's hard to soar like an eagle when you're surrounded by turkeys. |
|
Back to top |
|
|
PeterPotkay |
Posted: Thu Oct 27, 2016 4:38 pm Post subject: Re: 2 FRs, can only put to 1 of them? |
|
|
Poobah
Joined: 15 May 2001 Posts: 7717
|
exerk wrote: |
Vitor wrote: |
Yes. A message only ever exists on one queue manager in a cluster. |
Caveat: Pub/Sub |
I think you meant Caveat: z/OS Shared Queues _________________ Peter Potkay
Keep Calm and MQ On |
|
Back to top |
|
|
bruce2359 |
Posted: Thu Oct 27, 2016 5:34 pm Post subject: Re: 2 FRs, can only put to 1 of them? |
|
|
Poobah
Joined: 05 Jan 2008 Posts: 9442 Location: US: west coast, almost. Otherwise, enroute.
|
PeterPotkay wrote: |
exerk wrote: |
Vitor wrote: |
Yes. A message only ever exists on one queue manager in a cluster. |
Caveat: Pub/Sub |
I think you meant Caveat: z/OS Shared Queues |
Putting on my pedantic hat for a moment ...
An MQ clustered queue is a queue whose name (and owning qmgr name) is known to qmgrs that are members of the cluster. A single message MQPUT to a clustered queue sends a single instance of a message to only ONE instance of the clustered queue, and is not replicated to any other queue.
Exerk was referring to a built-in capability (cool trick) in pub/sub which allows for multiple destinations for a single MQPUT call; thus, the result is multiple messages - one to each named destination.
A z/OS Shared Queue represents a coupling-facility structure (queue) destination for an MQPUT message. No other instance of the message exists in any other queue on any other qmgr. _________________ I like deadlines. I like to wave as they pass by.
ב''ה
Lex Orandi, Lex Credendi, Lex Vivendi. As we Worship, So we Believe, So we Live. |
|
Back to top |
|
|
Vitor |
Posted: Fri Oct 28, 2016 4:33 am Post subject: Re: 2 FRs, can only put to 1 of them? |
|
|
Grand High Poobah
Joined: 11 Nov 2005 Posts: 26093 Location: Texas, USA
|
PeterPotkay wrote: |
exerk wrote: |
Vitor wrote: |
Yes. A message only ever exists on one queue manager in a cluster. |
Caveat: Pub/Sub |
I think you meant Caveat: z/OS Shared Queues |
Nope, I mentioned those. _________________ Honesty is the best policy.
Insanity is the best defence. |
|
Back to top |
|
|
mqjeff |
Posted: Fri Oct 28, 2016 5:11 am Post subject: |
|
|
Grand Master
Joined: 25 Jun 2008 Posts: 17447
|
Caveat 2033 _________________ chmod -R ugo-wx / |
|
Back to top |
|
|
hughson |
Posted: Sun Oct 30, 2016 2:03 pm Post subject: Re: 2 FRs, can only put to 1 of them? |
|
|
Padawan
Joined: 09 May 2013 Posts: 1948 Location: Bay of Plenty, New Zealand
|
mqprimerib wrote: |
But when I try it the reverse way, put to the other QM, I can't refresh the remote queue. MQ Visual Edit complains that it is a remote queue and I can ONLY put messages. |
As a number of people have said already, you must always be getting from a queue that is physically hosted on the queue manager you are connected to. If you are trying to get from the queue that is a cluster queue hosted elsewhere, you will get the error you mention.
Make sure you are pointing MQ Visual Edit at the QLOCAL and not the cluster queue defintion that represents the queue hosted in the other queue manager.
If you want more assistance, post the answers to these commands on both queue managers, and show what you are using with MQ Visual Edit to attempt to read the queue.
Code: |
DISPLAY QUEUE(*) WHERE(CLUSTER NE ' ') |
Code: |
DISPLAY QCLUSTER(*) |
Cheers
Morag _________________ Morag Hughson @MoragHughson
IBM MQ Technical Education Specialist
Get your IBM MQ training here!
MQGem Software |
|
Back to top |
|
|
mqprimerib |
Posted: Tue Nov 01, 2016 6:17 am Post subject: |
|
|
Apprentice
Joined: 30 Mar 2016 Posts: 36 Location: Detroit Rock City
|
Makes sense. I've defined qlocals with the cluster on both QMs now.
QM1:
Code: |
DISPLAY QUEUE(*) WHERE(CLUSTER NE ' ')
11 : DISPLAY QUEUE(*) WHERE(CLUSTER NE ' ')
AMQ8409: Display Queue details.
QUEUE(Q.DEADLETTER) TYPE(QLOCAL)
CLUSTER(CQ.IF14)
AMQ8409: Display Queue details.
QUEUE(Q.ERROR) TYPE(QLOCAL)
CLUSTER(CQ.IF14)
AMQ8409: Display Queue details.
QUEUE(Q.OB.IDVREQUEST) TYPE(QLOCAL)
CLUSTER(CQ.IF14)
AMQ8409: Display Queue details.
QUEUE(Q.OB.IDVREQUEST.NCC) TYPE(QLOCAL)
CLUSTER(CQ.IF14)
AMQ8409: Display Queue details.
QUEUE(Q.OB.IDVREQUEST.TU) TYPE(QLOCAL)
CLUSTER(CQ.IF14)
AMQ8409: Display Queue details.
QUEUE(Q.OB.IFT) TYPE(QLOCAL)
CLUSTER(CQ.IF14)
AMQ8409: Display Queue details.
QUEUE(Q.PRST.IDVRESPONSE) TYPE(QLOCAL)
CLUSTER(CQ.IF14)
AMQ8409: Display Queue details.
QUEUE(Q.SLEEP) TYPE(QLOCAL)
CLUSTER(CQ.IF14)
DISPLAY QCLUSTER(*)
12 : DISPLAY QCLUSTER(*)
AMQ8409: Display Queue details.
QUEUE(Q.DEADLETTER) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.DEADLETTER) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.ERROR) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.ERROR) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.OB.IDVREQUEST) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.OB.IDVREQUEST) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.OB.IDVREQUEST.NCC) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.OB.IDVREQUEST.NCC) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.OB.IDVREQUEST.TU) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.OB.IDVREQUEST.TU) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.OB.IFT) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.OB.IFT) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.PRST.IDVRESPONSE) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.PRST.IDVRESPONSE) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.SLEEP) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.SLEEP) TYPE(QCLUSTER)
|
QM2:
Code: |
DISPLAY QUEUE(*) WHERE(CLUSTER NE ' ')
1 : DISPLAY QUEUE(*) WHERE(CLUSTER NE ' ')
AMQ8409: Display Queue details.
QUEUE(Q.DEADLETTER) TYPE(QLOCAL)
CLUSTER(CQ.IF14)
AMQ8409: Display Queue details.
QUEUE(Q.ERROR) TYPE(QLOCAL)
CLUSTER(CQ.IF14)
AMQ8409: Display Queue details.
QUEUE(Q.OB.IDVREQUEST) TYPE(QLOCAL)
CLUSTER(CQ.IF14)
AMQ8409: Display Queue details.
QUEUE(Q.OB.IDVREQUEST.NCC) TYPE(QLOCAL)
CLUSTER(CQ.IF14)
AMQ8409: Display Queue details.
QUEUE(Q.OB.IDVREQUEST.TU) TYPE(QLOCAL)
CLUSTER(CQ.IF14)
AMQ8409: Display Queue details.
QUEUE(Q.OB.IFT) TYPE(QLOCAL)
CLUSTER(CQ.IF14)
AMQ8409: Display Queue details.
QUEUE(Q.PRST.IDVRESPONSE) TYPE(QLOCAL)
CLUSTER(CQ.IF14)
AMQ8409: Display Queue details.
QUEUE(Q.SLEEP) TYPE(QLOCAL)
CLUSTER(CQ.IF14)
DISPLAY QCLUSTER(*)
2 : DISPLAY QCLUSTER(*)
AMQ8409: Display Queue details.
QUEUE(Q.DEADLETTER) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.DEADLETTER) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.ERROR) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.ERROR) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.OB.IDVREQUEST) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.OB.IDVREQUEST) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.OB.IDVREQUEST.NCC) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.OB.IDVREQUEST.NCC) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.OB.IDVREQUEST.TU) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.OB.IDVREQUEST.TU) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.OB.IFT) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.OB.IFT) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.PRST.IDVRESPONSE) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.PRST.IDVRESPONSE) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.SLEEP) TYPE(QCLUSTER)
AMQ8409: Display Queue details.
QUEUE(Q.SLEEP) TYPE(QCLUSTER)
|
|
|
Back to top |
|
|
exerk |
Posted: Tue Nov 01, 2016 7:02 am Post subject: |
|
|
Jedi Council
Joined: 02 Nov 2006 Posts: 6339
|
I am assuming that Q.DEADLETTER is the defined DLQ in each queue manager, and if so, why have you shared each one in the cluster? _________________ It's puzzling, I don't think I've ever seen anything quite like this before...and it's hard to soar like an eagle when you're surrounded by turkeys. |
|
Back to top |
|
|
bruce2359 |
Posted: Tue Nov 01, 2016 7:28 am Post subject: |
|
|
Poobah
Joined: 05 Jan 2008 Posts: 9442 Location: US: west coast, almost. Otherwise, enroute.
|
mqprimerib wrote: |
Makes sense. I've defined qlocals with the cluster on both QMs now. |
Did you intend to define ALL of your local queues as cluster queues? If so, why? _________________ I like deadlines. I like to wave as they pass by.
ב''ה
Lex Orandi, Lex Credendi, Lex Vivendi. As we Worship, So we Believe, So we Live. |
|
Back to top |
|
|
mqprimerib |
Posted: Wed Nov 02, 2016 9:28 am Post subject: |
|
|
Apprentice
Joined: 30 Mar 2016 Posts: 36 Location: Detroit Rock City
|
exerk wrote: |
I am assuming that Q.DEADLETTER is the defined DLQ in each queue manager, and if so, why have you shared each one in the cluster? |
Good call exerk. I've removed the cluster designation from the DLQ. Tnx
Code: |
dis QUEUE(Q.DEADLETTER)
2 : dis QUEUE(Q.DEADLETTER)
AMQ8409: Display Queue details.
QUEUE(Q.DEADLETTER) TYPE(QLOCAL)
ACCTQ(QMGR) ALTDATE(2016-11-01)
ALTTIME(19.45.20) BOQNAME( )
BOTHRESH(0) CLUSNL( )
CLUSTER( ) CLCHNAME( )
...
|
|
|
Back to top |
|
|
mqprimerib |
Posted: Wed Nov 02, 2016 10:08 am Post subject: |
|
|
Apprentice
Joined: 30 Mar 2016 Posts: 36 Location: Detroit Rock City
|
bruce2359 wrote: |
mqprimerib wrote: |
Makes sense. I've defined qlocals with the cluster on both QMs now. |
Did you intend to define ALL of your local queues as cluster queues? If so, why? |
Being new to QM clustering, I ran with the all or nothing approach. (see DLQ post above)
So, the qlocal(Q.*) is where the application does its work. But after looking through the list, I should probably only define cluster queues named Q.OB.* and Q.PRST.* |
|
Back to top |
|
|
bruce2359 |
Posted: Wed Nov 02, 2016 12:00 pm Post subject: |
|
|
Poobah
Joined: 05 Jan 2008 Posts: 9442 Location: US: west coast, almost. Otherwise, enroute.
|
mqprimerib wrote: |
So, the qlocal(Q.*) is where the application does its work. But after looking through the list, I should probably only define cluster queues named Q.OB.* and Q.PRST.* |
The purpose of mq clustering is to have the destination queue, and the application that consumes messages from it, replicated across multiple qmgrs. This is referred to 'workload distribution.'
Q.* is not where application does its work. Applications MQOPEN a specific queue by its name, like a TIMECARD.QUEUE or INVENTORY.QUEUE. _________________ I like deadlines. I like to wave as they pass by.
ב''ה
Lex Orandi, Lex Credendi, Lex Vivendi. As we Worship, So we Believe, So we Live. |
|
Back to top |
|
|
|