docs: public void run()
      {
          m_thread = this;
          while (m_thread != null)
          {
              int iErrorCode = Constant.NORMAL_RETURN;
              BaseMessage message = (BaseMessage)this.receiveMessage();        // Hang until a message comes through
              if ((message == null) || (m_thread == null))
                  return;      // End of processing, stop this thread.
              Iterator<BaseMessageFilter> iterator = this.getFilterList(message.getMessageHeader());
              while (iterator.hasNext())
              {
                  if (message.isConsumed())
                      break;     // All done. with this message, continue with the next message.
                  try {
                      BaseMessageFilter filter = iterator.next();
                      if (filter.isFilterMatch(message.getMessageHeader()))
                      {
                          BaseMessage messageToSend = message;
                          for (int i = 0; ; i++)
                          {
                              JMessageListener listener = filter.getMessageListener(i);
                              if (listener == null)
                                  break;
                              if (filter.isThinTarget())
                                  if (listener.isThinListener())
                              {
                                  if (messageToSend == message)
                                      messageToSend = message.convertToThinMessage(); // If you are sending a thick message to a thin client, convert it first. Note: don't worry about calling this with a thin message... no conversion will be done there.
                                  else
                                      messageToSend = messageToSend.convertToThinMessage();   // Previously processed but not converted
                              }
                              if (listener instanceof org.jbundle.model.Remote)
                                  if (filter.getRegistryID() != null)
                                      if (messageToSend.getMessageHeader() != null)
                                          if (messageToSend.getMessageHeader().getRegistryIDMatch() == null)
                              {
                                  try {
                                      if (messageToSend == message)
                                          messageToSend = (BaseMessage)messageToSend.clone(); // If I change the message, I need a new copy
                                  } catch (CloneNotSupportedException e) {
                                      e.printStackTrace();
                                  }
                                  messageToSend.getMessageHeader().setRegistryIDMatch(filter.getRegistryID());    // Typically used for remote filters to match filter ID.
                              }
                              iErrorCode = listener.handleMessage(messageToSend);
                              if (iErrorCode != Constant.NORMAL_RETURN)
                                  break;
                              message.setConsumed(messageToSend.isConsumed());
                              if (message.isConsumed())
                                  break;     // All done. with this message, continue with the next message.
                          }
                      }
                  } catch (ConcurrentModificationException ex)    {
                      Util.getLogger().warning("Message filter Concurrent Modification");   // Warning: Someone modified the filter list while I was cruzin it.
                      iterator = this.getFilterList(message.getMessageHeader());  // Start from the beginning again
                  }
              }
          }
      }