docs: private void sendMeNotificationEvent(short eventId, SICoreConnection conn, ConsumerSession sess, Throwable t)
                      throws SIConnectionLostException,
                      SIConnectionDroppedException,
                      SIConnectionUnavailableException {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.entry(tc, "sendMeNotificationEvent",
                          new Object[]
                          {
                           "" + eventId,
                           conn,
                           sess,
                           t
                          });
  
          Conversation conversation = null;
          int consumerId = -1;
  
          // Get the conversation. If we have an SICoreConnection handed to us, we can dive into the 
          // hashtable and retrieve the correct one.
          if (conn != null) {
              conversation = conversationTable.get(conn);
          } else {
              // If no SICoreConnection was passed in (for example when sending an async exception we 
              // could retrieve that from the ConsumerSession. However, it is most likely that the reason 
              // we are sending the async exception is because the session has gone down and so the most 
              // reliable way is to iterate over all the Conversations we know about. We expect this
              // operation to be a fairly 'one off' - and so we don't need the performance
              for (Iterator<Conversation> i = conversationTable.values().iterator(); i.hasNext();) {
                  conversation = i.next();
                  ConversationState convState = (ConversationState) conversation.getAttachment();
  
                  // For each conversation look for the right Consumer Session
                  List allObjs = convState.getAllObjects();
                  for (int x = 0; x < allObjs.size(); x++) {
                      if (allObjs.get(x) instanceof CATMainConsumer) {
                          CATMainConsumer mainConsumer = (CATMainConsumer) allObjs.get(x);
                          ConsumerSession ourSession = mainConsumer.getConsumerSession();
  
                          // If we have found it, save the client session Id
                          if (ourSession == sess) {
                              consumerId = mainConsumer.getClientSessionId();
                              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                                  SibTr.debug(this, tc, "Located consumer. Session Id is", "" + consumerId);
                              break;
                          }
                      }
                  }
  
                  if (consumerId != -1)
                      break;
              }
          }
  
          // Check here to see if the consumer Id is 0. If this is the case then this consumer is 
          // currently synchronous and probably in the middle of an operation such as a receiveWithWait.
          // In this case, do not send the notification back to the peer (as a consumerId of 0 will
          // break the client and cause the connection to be terminated) but let the consumer sessions
          // connection listener send the notification back.
          if (consumerId == 0) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                  SibTr.debug(this, tc, "Consumer Id was 0 - ignoring this notification");
          } else {
              if (conversation == null) {
                  // Not a lot we can do here. So FFDC, but do not register
                  // that we have notified this client about the termination
                  // of this ME
                  NullPointerException npe = new NullPointerException("No conversation was located");
  
                  FFDCFilter.processException(npe,
                                              CLASS_NAME + ".sendMeNotificationEvent",
                                              CommsConstants.SERVERSICORECONNECTIONLISTENER_MEN_01,
                                              this);
  
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                      SibTr.debug(tc, npe.getMessage(), npe);
              } else if (sess != null && consumerId == -1) {
                  // This exception is generated purely for FFDC
                  SIResourceException e = new SIResourceException("Unable to locate consumer session");
  
                  FFDCFilter.processException(e,
                                              CLASS_NAME + ".sendMeNotificationEvent",
                                              CommsConstants.SERVERSICORECONNECTIONLISTENER_MEN_01,
                                              this); // d192146
  
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                      SibTr.debug(tc, e.getMessage(), e);
              } else {
                  // Otherwise inform the client
                  ConversationState convState = (ConversationState) conversation.getAttachment();
  
                  CommsByteBuffer buffer = CommsByteBufferPool.getInstance().allocate();
                  buffer.putShort(convState.getConnectionObjectId()); // BIT16 ConnectionObjectId
                  buffer.putShort(eventId); // BIT16 Event Id
                  if (sess != null) {
                      buffer.putShort(consumerId);
                      buffer.putException(t, null, conversation);
                  }
  
                  //in case if event id is EVENTID_ME_QUIESCING or EVENTID_ME_TERMINATED then dont block the thread because
                  //this may function may get executed in the context of SCR thread and should not get blocked..
                  //but it is very rare foo this function (i.e send)d to get blocked.. however those rare cases can be 
                  //avoided by setting the ThrottlingPolicy to DISCARD_TRANSMISSION. In the event of ME termination/Quiescing, this should
                  // be harmless
                  if (eventId == CommsConstants.EVENTID_ME_TERMINATED || eventId == CommsConstants.EVENTID_ME_QUIESCING) {
                      conversation.send(buffer,
                                        JFapChannelConstants.SEG_EVENT_OCCURRED,
                                        0,
                                        JFapChannelConstants.PRIORITY_HIGH,
                                        true,
                                        ThrottlingPolicy.DISCARD_TRANSMISSION,
                                        null);
                  } else {
                      conversation.send(buffer,
                                        JFapChannelConstants.SEG_EVENT_OCCURRED,
                                        0,
                                        JFapChannelConstants.PRIORITY_HIGH,
                                        true,
                                        ThrottlingPolicy.BLOCK_THREAD,
                                        null);
  
                  }
              }
          }
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.exit(tc, "sendMeNotificationEvent");
      }