docs: @Override
      public ConsumerSession createConsumerSessionForDurableSubscription(String subscriptionName,
                                                                         boolean enableReadAhead,
                                                                         Reliability unrecoverableReliability,
                                                                         boolean bifurcatable)
  
                      throws SIConnectionUnavailableException, SIConnectionDroppedException,
                      SIErrorException,
                      SIDurableSubscriptionNotFoundException, SIDurableSubscriptionMismatchException,
                      SIDestinationLockedException, SIIncorrectCallException, SIResourceException
      {
          if (TraceComponent.isAnyTracingEnabled() && CoreSPIConnection.tc.isEntryEnabled())
              SibTr.entry(
                          CoreSPIConnection.tc,
                          "createConsumerSessionForDurableSubscription",
                          new Object[] {
                                        this,
                                        subscriptionName,
                                        Boolean.valueOf(enableReadAhead),
                                        unrecoverableReliability,
                                        Boolean.valueOf(bifurcatable) });
  
          // Do not need to check that the destination information is correct.
          // As we are using the subscription data straight from the named subscription
  
          // Find the ConsumerDispatcher for this subscription
          // Note that it must be homed on this ME
          HashMap durableSubs = _destinationManager.getDurableSubscriptionsTable();
  
          ConsumerDispatcher cd = null;
          synchronized (durableSubs)
          {
              //Look up the consumer dispatcher for this subId in the system durable subs list
              cd =
                              (ConsumerDispatcher) durableSubs.get(subscriptionName);
  
              // Check that the durable subscription exists
              if (cd == null)
              {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                      SibTr.exit(tc, "createConsumerSessionForDurableSubscription");
  
                  throw new SIDurableSubscriptionNotFoundException(
                                  nls.getFormattedMessage(
                                                          "SUBSCRIPTION_DOESNT_EXIST_ERROR_CWSIP0072",
                                                          new Object[] { subscriptionName,
                                                                        _messageProcessor.getMessagingEngineName() },
                                                          null));
              }
          }
  
          //Get the destinationHandler from the ConsumerDispatcher
          //Note that we know it is PubSub  
          DestinationHandler destination = cd.getDestination();
          SIDestinationAddress destinationAddress = SIMPUtils.createJsDestinationAddress(
                                                                                         destination.getName(),
                                                                                         _messageProcessor.getMessagingEngineUuid());
  
          //Get the state object representing the subscription from the ConsumerDispatcher
          ConsumerDispatcherState subState = cd.getConsumerDispatcherState();
  
          ConsumerSessionImpl consumer = null;
  
          // Synchronize on the close object, we don't want the connection closing
          // while we try to add the subscription.
          synchronized (this)
          {
              // See if this connection has been closed
              checkNotClosed();
  
              //create the consumer session for this subscription
              try
              {
                  consumer =
                                  new ConsumerSessionImpl(destination,
                                                  destinationAddress,
                                                  subState,
                                                  this,
                                                  enableReadAhead,
                                                  false,
                                                  unrecoverableReliability,
                                                  bifurcatable,
                                                  true,
                                                  false);
              } catch (SINotPossibleInCurrentConfigurationException e)
              {
                  // No FFDC code needed
                  if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                      SibTr.exit(tc, "createConsumerSessionForDurableSubscription", "SIErrorException");
                  throw new SIErrorException(e);
              } catch (SISessionUnavailableException e)
              {
                  // FFDC
                  FFDCFilter
                                  .processException(
                                                    e,
                                                    "com.ibm.ws.sib.processor.impl.ConnectionImpl.createConsumerSessionForDurableSubscription",
                                                    "1:2129:1.347.1.25",
                                                    this);
  
                  SibTr.error(tc, "INTERNAL_MESSAGING_ERROR_CWSIP0002",
                              new Object[] {
                                            "com.ibm.ws.sib.processor.impl.ConnectionImpl",
                                            "1:1809:1.285",
                                            e });
  
                  // This should never be thrown
                  if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                      SibTr.exit(tc, "createConsumerSessionForDurableSubscription", "SIErrorException");
                  throw new SIErrorException(
                                  nls.getFormattedMessage(
                                                          "INTERNAL_MESSAGING_ERROR_CWSIP0002",
                                                          new Object[] {
                                                                        "com.ibm.ws.sib.processor.impl.ConnectionImpl",
                                                                        "1:2146:1.347.1.25",
                                                                        e },
                                                          null),
                                  e);
              } catch (SITemporaryDestinationNotFoundException e)
              {
                  // FFDC
                  FFDCFilter
                                  .processException(
                                                    e,
                                                    "com.ibm.ws.sib.processor.impl.ConnectionImpl.createConsumerSessionForDurableSubscription",
                                                    "1:2159:1.347.1.25",
                                                    this);
  
                  SibTr.error(tc, "INTERNAL_MESSAGING_ERROR_CWSIP0002",
                              new Object[] {
                                            "com.ibm.ws.sib.processor.impl.ConnectionImpl",
                                            "1:2165:1.347.1.25",
                                            e });
  
                  // This should never be thrown
                  if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                      SibTr.exit(tc, "createConsumerSessionForDurableSubscription", "SIErrorException");
                  throw new SIErrorException(
                                  nls.getFormattedMessage(
                                                          "INTERNAL_MESSAGING_ERROR_CWSIP0002",
                                                          new Object[] {
                                                                        "com.ibm.ws.sib.processor.impl.ConnectionImpl",
                                                                        "1:2176:1.347.1.25",
                                                                        e },
                                                          null),
                                  e);
              } catch (SINonDurableSubscriptionMismatchException e)
              {
                  SibTr.error(tc, "INTERNAL_MESSAGING_ERROR_CWSIP0002",
                              new Object[] {
                                            "com.ibm.ws.sib.processor.impl.ConnectionImpl",
                                            "1:1953:1.347.1.25",
                                            e });
  
                  // This should never be thrown
                  if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                      SibTr.exit(tc, "createConsumerSessionForDurableSubscription", "SIErrorException");
                  throw new SIErrorException(
                                  nls.getFormattedMessage(
                                                          "INTERNAL_MESSAGING_ERROR_CWSIP0002",
                                                          new Object[] {
                                                                        "com.ibm.ws.sib.processor.impl.ConnectionImpl",
                                                                        "1:1964:1.347.1.25",
                                                                        e },
                                                          null),
                                  e);
              }
  
              synchronized (_consumers)
              {
                  //store a reference
                  _consumers.add(consumer);
              }
  
              _messageProcessor.addConsumer(consumer);
          }
  
          if (TraceComponent.isAnyTracingEnabled() && CoreSPIConnection.tc.isEntryEnabled())
              SibTr.exit(CoreSPIConnection.tc, "createConsumerSessionForDurableSubscription", consumer);
          return consumer;
      }