Thursday, October 31, 2013

How to get rid of SIBus queue points in state DELETE_PENDING

Sometimes, when deleting a destination from a SIBus, the corresponding queue point is not deleted from the underlying messaging engine, but remains in state DELETE_PENDING. This manifests itself in three ways:

  1. The queue point is still visible in the runtime view of the messaging engine in the admin console. To see this, go to the admin console page for the messaging engine, switch to the "Runtime" tab and then click on "Queue points".

  2. The MBean for the queue point is still registered by the messaging engine. The state attribute of that MBean will have value DELETE_PENDING.

  3. Each time the messaging engine is started, the following message appears in the logs:

    CWSIP0063I: The local destination <name> with UUID <uuid> has been marked for deletion.

It is not exactly clear under which conditions this issue occurs, but apparently it has to do with the existence of remote queue points, i.e. with the production or consumption of messages through a remote messaging engine.

To clean up these queue points and eliminate the recurring CWSIP0063I messages, use the following wsadmin script:

objName = AdminControl.makeObjectName('WebSphere:type=SIBQueuePoint,*')
queuepoints = AdminControl.queryNames_jmx(objName, None)
for queuepoint in queuepoints:
    name = queuepoint.getKeyProperty("name")
    if (not name.startswith("_") and AdminControl.invoke_jmx(queuepoint, 'getState', [], []) == 'DELETE_PENDING'):
        print 'Found SIBQueuePoint in state DELETE_PENDING: ' + name
        irs = AdminControl.invoke_jmx(queuepoint, 'listInboundReceivers', [], [])
        for ir in irs:
            AdminControl.invoke_jmx(queuepoint, 'flush', [ir], ['com.ibm.websphere.sib.admin.SIBInboundReceiver'])
            print 'Called flush on SIBQueuePoint for inbound receiver: ' + name
        cts = AdminControl.invoke_jmx(queuepoint, 'listRemoteConsumerTransmitters', [], [])
        for ct in cts:
            AdminControl.invoke_jmx(queuepoint, 'flush', [ct], ['com.ibm.websphere.sib.admin.SIBRemoteConsumerTransmitter'])
            print 'Called flush on SIBQueuePoint for remote consumer transmitter: ' + name

Update:

  • The flush operations used by the script are actually deprecated, but it the documentation doesn't specify which operations should be used instead.
  • The script may fail because the queue may already be deleted after the flush of the SIBInboundReceiver objects. In that case subsequent operations fail because the MBean no longer exist. As a workaround, simply reexecute the script.

No comments:

Post a Comment