Removing a cluster queue from a queue manager

Disable the INVENTQ queue at Toronto. Send all the inventory messages to New York, and delete the INVENTQ queue at Toronto when it is empty.

Before you begin

Note: For changes to a cluster to be propagated throughout the cluster, at least one full repository must always be available. Ensure that your repositories are available before starting this task.
Scenario:
  • The INVENTORY cluster has been set up as described in Adding a queue manager that hosts a queue. It contains four queue managers. LONDON and NEWYORK both hold full repositories. PARIS and TORONTO hold partial repositories. The inventory application runs on the systems in New York and Toronto and is driven by the arrival of messages on the INVENTQ queue.
  • Because of reduced workload, you no longer want to run the inventory application in Toronto. You want to disable the INVENTQ queue hosted by the queue manager TORONTO, and have TORONTO feed messages to the INVENTQ queue in NEWYORK.
  • Network connectivity exists between all four systems.
  • The network protocol is TCP.

About this task

Follow these steps to remove a cluster queue.

Procedure

  1. Indicate that the queue is no longer available.

    To remove a queue from a cluster, remove the cluster name from the local queue definition. Alter the INVENTQ on TORONTO so that it is not accessible from the rest of the cluster:

    
    ALTER QLOCAL(INVENTQ) CLUSTER(' ')
    
  2. Check that the queue is no longer available.
    On a full repository queue manager, either LONDON or NEWYORK, check that the queue is no longer hosted by queue manager TORONTO by issuing the following command:
    
    DIS QCLUSTER (INVENTQ)
    
    TORONTO is not listed in the results, if the ALTER command has completed successfully.
  3. Disable the queue.
    Disable the INVENTQ queue at TORONTO so that no further messages can be written to it:
    
    ALTER QLOCAL(INVENTQ) PUT(DISABLED)
    

    Now messages in transit to this queue using MQOO_BIND_ON_OPEN go to the dead-letter queue. You need to stop all applications from putting messages explicitly to the queue on this queue manager.

  4. Monitor the queue until it is empty.

    Monitor the queue using the DISPLAY QUEUE command, specifying the attributes IPPROCS, OPPROCS, and CURDEPTH, or use the WRKMQMSTS command on IBM® i. When the number of input and output processes, and the current depth of the queuesare all zero, the queue is empty.

  5. Monitor the channel to ensure there are no in-doubt messages.
    To be sure that there are no in-doubt messages on the channel INVENTORY.TORONTO, monitor the cluster-sender channel called INVENTORY.TORONTO on each of the other queue managers. Issue the DISPLAY CHSTATUS command specifying the INDOUBT parameter from each queue manager:
    
    DISPLAY CHSTATUS(INVENTORY.TORONTO) INDOUBT
    

    If there are any in-doubt messages, you must resolve them before proceeding. For example, you might try issuing the RESOLVE channel command or stopping and restarting the channel.

  6. Delete the local queue.
    When you are satisfied that there are no more messages to be delivered to the inventory application at TORONTO, you can delete the queue:
    
    DELETE QLOCAL(INVENTQ)
    
  7. You can now remove the inventory application from the system in Toronto
    Removing the application avoids duplication and saves space on the system.

Results

The cluster set up by this task is like that setup by the previous task. The difference is the INVENTQ queue is no longer available at queue manager TORONTO.

When you took the queue out of service in step 1, the TORONTO queue manager sent a message to the two full repository queue managers. It notified them of the change in status. The full repository queue managers pass on this information to other queue managers in the cluster that have requested updates to information concerning the INVENTQ.

When a queue manager puts a message on the INVENTQ queue the updated partial repository indicates that the INVENTQ queue is available only at the NEWYORK queue manager. The message is sent to the NEWYORK queue manager.

What to do next

In this task, there was only one queue to remove and only one cluster to remove it from.

Suppose that there are many queues referring to a namelist containing many cluster names. For example, the TORONTO queue manager might host not only the INVENTQ, but also the PAYROLLQ, SALESQ, and PURCHASESQ. TORONTO makes these queues available in all the appropriate clusters, INVENTORY, PAYROLL, SALES, and PURCHASES. Define a namelist of the cluster names on the TORONTO queue manager:

DEFINE NAMELIST(TOROLIST)
DESCR('List of clusters TORONTO is in')
NAMES(INVENTORY, PAYROLL, SALES, PURCHASES)
Add the namelist to each queue definition:

DEFINE QLOCAL(INVENTQ) CLUSNL(TOROLIST)
DEFINE QLOCAL(PAYROLLQ) CLUSNL(TOROLIST)
DEFINE QLOCAL(SALESQ) CLUSNL(TOROLIST)
DEFINE QLOCAL(PURCHASESQ) CLUSNL(TOROLIST)

Now suppose that you want to remove all those queues from the SALES cluster, because the SALES operation is to be taken over by the PURCHASES operation. All you need to do is alter the TOROLIST namelist to remove the name of the SALES cluster from it.

If you want to remove a single queue from one of the clusters in the namelist, create a namelist, containing the remaining list of cluster names. Then alter the queue definition to use the new namelist. To remove the PAYROLLQ from the INVENTORY cluster:
  1. Create a namelist:
    
    DEFINE NAMELIST(TOROSHORTLIST)
    DESCR('List of clusters TORONTO is in other than INVENTORY')
    NAMES(PAYROLL, SALES, PURCHASES)
    
  2. Alter the PAYROLLQ queue definition:
    
    ALTER QLOCAL(PAYROLLQ) CLUSNL(TOROSHORTLIST)