docs: @Override
      public boolean put(
                         SIMPMessage msg,
                         TransactionCommon tran,
                         InputHandlerStore inputHandlerStore,
                         boolean storedByIH) throws SIDiscriminatorSyntaxException, SIResourceException
      {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.entry(
                          tc,
                          "put",
                          new Object[] { msg, tran, inputHandlerStore, Boolean.valueOf(storedByIH) });
  
          //Set a unique id in the message if explicitly told to or
          //if one has not already been set
          JsMessage jsMsg = msg.getMessage();
          if (msg.getRequiresNewId() || jsMsg.getSystemMessageId() == null)
          {
              jsMsg.setSystemMessageSourceUuid(_messageProcessor.getMessagingEngineUuid());
              jsMsg.setSystemMessageValue(_messageProcessor.nextTick());
              msg.setRequiresNewId(false);
          }
  
          // If COA Report messages are required, this is when we need to create and
          // send them.
  
          if (msg.getMessage().getReportCOA() != null)
          {
              // PM81457.dev: If the target destination for the message is WMQ, WMQ would produce the report
              // message and put it in to the reply queue (set in reverse routing path for the message).
              // So we should avoid SIB to produce report message for the below reasons.
              //  (1) There will be a duplicate report message and hence applications are mandated to consume
              //      both report messages, otherwise second report message would stay in the reply queue forever.
              //  (2) When application consumes the SIBus report, it might think that the report message is
              //      from WMQand the message flow ends. But it possible that there could be a failure from
              //      WMQ side and it would never send a report message.
              if (!_baseDestHandler.isMQLink()) {
                  // Create the ReportHandler object if not already created
                  if (reportHandler == null)
                      reportHandler = new ReportHandler(_messageProcessor);
  
                  try
                  {
                      reportHandler.handleMessage(msg, tran, SIApiConstants.REPORT_COA);
                  } catch (Exception e)
                  {
                      FFDCFilter.processException(
                                                  e,
                                                  "com.ibm.ws.sib.processor.impl.ConsumerDispatcher.put",
                                                  "1:912:1.280.5.25",
                                                  this);
  
                      SibTr.exception(tc, e);
  
                      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                          SibTr.exit(tc, "put", "SIResourceException");
  
                      throw new SIResourceException(e);
                  }
              }
              else
              {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                      SibTr.debug(tc, "Ignored report message generation for the request message targeted for MQ destination (via MQLink)", _baseDestHandler.getName());
              }
          }
  
          // TODO : Can we do a seperate early check for noLocal on non-durable subs here?
  
          // 174000
          // If pt-to-pt and the put was transacted then we know we need to store the message
          // The message will then be dispatched as part of the postCommit callback.
          // If pubsub, we delay the store until we know whether noLocal is set and any
          // consumers actually need the message.
  
          if (msg.isTransacted() && !_isPubSub)
          {
              final boolean retVal =
                              storeMessage((MessageItem) msg, tran, inputHandlerStore, storedByIH);
  
              if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                  SibTr.exit(tc, "put", Boolean.valueOf(retVal));
  
              return retVal;
          }
  
          final boolean retVal =
                          internalPut(msg, tran, inputHandlerStore, storedByIH, false, true);
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.exit(tc, "put", Boolean.valueOf(retVal));
  
          return retVal;
      }