docs: protected void eventPreUnlocked(SIMPMessage msg, TransactionCommon tran)
      {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.entry(tc, "eventPreUnlocked", new Object[] { msg, msg.guessRedeliveredCount() });
  
          /*
           * 166955.4
           * Check whether the retryCount has been exceeded. If it has then this is a poison msg
           * and needs to be sent to the exception destination rather than to a valid consumer
           * again
           */
          // But only check for messages that are not persistently locked (messages involved in RemoteGet)
          // Otherwise the remote get protocols dont work
  
          if ((msg.guessRedeliveredCount() + 1) >= _baseDestHandler.getMaxFailedDeliveries())
          {
              /*
               * Message has been delivered a greater number of times than allowed.
               * Route message on to the exception destination associated with this
               * destination.
               */
  
              // Deregister rollback callbacks to avoid recursive event callbacks
              msg.deregisterMessageEventListener(MessageEvents.POST_ROLLBACK_REMOVE, this);
              msg.deregisterMessageEventListener(MessageEvents.POST_ROLLBACK_ADD, this);
  
              UndeliverableReturnCode rc = null;
              try
              {
                  if (_isPubSub)
                  {
                      // F001333-14610
                      // Pass the subscription ID to the destination handler
                      // so that it can be set on the exceptioned message.
                      rc = _baseDestHandler.handleUndeliverableMessage(msg,
                                                                       SIRCConstants.SIRC0035_BACKOUT_THRESHOLD_ERROR,
                                                                       new String[] { _baseDestHandler.getName(),
                                                                                     _messageProcessor.getMessagingEngineName() },
                                                                       tran,
                                                                       dispatcherState.getSubscriberID());
                  }
                  else
                  {
                      // Not pub sub so no subscription ID to pass
                      rc = _baseDestHandler.handleUndeliverableMessage(msg,
                                                                       SIRCConstants.SIRC0035_BACKOUT_THRESHOLD_ERROR,
                                                                       new String[] { _baseDestHandler.getName(),
                                                                                     _messageProcessor.getMessagingEngineName() },
                                                                       tran);
                  }
              } catch (SIResourceException e)
              {
                  // No FFDC code needed
                  // Exception had already been handled
              }
  
              // re-register the callbacks
              msg.registerMessageEventListener(MessageEvents.POST_ROLLBACK_REMOVE, this);
              msg.registerMessageEventListener(MessageEvents.POST_ROLLBACK_ADD, this);
  
              if (rc == null || rc == UndeliverableReturnCode.ERROR)
              {
                  // Spin of a new alarm
                  _messageProcessor.getAlarmManager().
                                  create(SIMPConstants.EXCEPTION_RETRY_TIMEOUT,
                                         new ExceptionDestinationRetryHandler(msg, this));
              }
  
              if (rc == UndeliverableReturnCode.BLOCK)
              {
                  // PK03344 - Handle retry count when no exception destination available
                  // When the retry count is reached and we have nowhere to send the message
                  // we suspend the consumer for a period of time to avoid 100% cpu usage
                  // due to continuous message retry.
  
                  // MDBs will only have one consumer (PK03344 handles the MDB case).
                  // For multiple consumers we suspend them all.
  
                  // Pause the consumers for the specified time
                  pauseConsumers(msg, _baseDestHandler.getBlockedRetryInterval());
              }
  
              if (rc != UndeliverableReturnCode.BLOCK)
                  msg.setRedeliveryCountReached();
  
          } // End of 165955.4
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.exit(tc, "eventPreUnlocked");
      }