/**
  * Broadcast a Notification message.
  *
  * @param notification The Notification message to broadcast.
  */
 static void broadcast(INotification notification) {
   try {
     Notifier.getInstance().broadcast(notification);
   } catch (Exception ex) {
     Logger.error(
         ILogErrorCodes.GT_CONNECTION_DELEGATE_HELPER,
         "[DelegateHelper.broadcastConnectionState] Fail to broadcast. Error: " + ex.getMessage(),
         ex);
   }
 }
  /**
   * TWX 23072008 Add in broadcast with retry (not under new transaction)
   *
   * @param notification
   * @throws Exception
   */
  public static void broadcast(INotification notification) throws Exception {
    boolean isRetryEnabled = _retryCount <= 0 ? false : true;
    int retryCount = _retryCount;
    Exception ex1 = null;

    do {
      try {
        Notifier.getInstance().broadcast(notification);
        retryCount = -10;
      } catch (Exception ex) {

        if (isRetryEnabled && isRetryableException(ex)) {
          ex1 = new JMSFailureException(ex);
          Log.warn(
              Log.FRAMEWORK,
              "Broadcast: JMS exception found. Reconnect after "
                  + _sleepFor / 1000
                  + " num retry left: "
                  + retryCount,
              ex);
          try {
            Thread.sleep(_sleepFor);
          } catch (Exception e) {

          }
          Log.debug(Log.FRAMEWORK, "Broadcast: JMS exception catched: wake up !");
        } else {
          Log.warn(
              Log.FRAMEWORK,
              "Broadcast: Non Retryable exception found. No retry will be performed.",
              ex);
          throw ex;
        }
      }
    } while (retryCount-- > 0);

    if (isRetryEnabled && retryCount == -1 && ex1 != null) {
      Log.debug(Log.FRAMEWORK, "Broadcast: JMS retry send exhausted. Throw up ex.", ex1);

      throw ex1;
    }
  }
  /**
   * Broadcast the notification under a new transaction. Whenever encouter JMS retryable error, it
   * will perform retry until max retry has reached. If it happen, the JMS msg will be stored in the
   * DB.
   *
   * @param notification
   * @throws Exception
   */
  public static void broadcastWithPersist(INotification notification) throws Exception {
    boolean isRetryEnabled = _retryCount <= 0 ? false : true;
    int retryCount = _retryCount;
    Exception ex1 = null;

    do {
      try {
        getLocalNotifierMgr().broadCastNotification(notification);
        retryCount = -10;
      } catch (Exception ex) {

        if (isRetryEnabled && isRetryableException(ex)) {
          ex1 = ex;
          Log.warn(
              Log.FRAMEWORK,
              "Broadcast: JMS exception found. Reconnect after "
                  + _sleepFor / 1000
                  + " num retry left: "
                  + retryCount,
              ex);
          try {
            Thread.sleep(_sleepFor);
          } catch (Exception e) {

          }
          Log.debug(Log.FRAMEWORK, "Broadcast: JMS exception catched: wake up !");
        } else {
          Log.warn(
              Log.FRAMEWORK,
              "Broadcast: Non Retryable exception found. No retry will be performed.",
              ex);
          throw ex;
        }
      }
    } while (retryCount-- > 0);

    if (isRetryEnabled && retryCount == -1 && ex1 != null) {
      Log.debug(
          Log.FRAMEWORK,
          "Broadcast: JMS retry send exhausted. Dumping the out JMS message for later retry.",
          ex1);

      Hashtable<String, String> msgProps = new Hashtable<String, String>();
      msgProps.put("id", notification.getNotificationID());
      msgProps.put(SystemUtil.HOSTID_PROP_KEY, SystemUtil.getHostId());
      String[] properties = notification.getPropertyKeys();
      for (int i = 0; i < properties.length; i++) {
        Log.debug(
            Log.FRAMEWORK,
            "Broadcast: Adding msg props : key: "
                + properties[i]
                + " value: "
                + notification.getProperty(properties[i]));
        msgProps.put(properties[i], notification.getProperty(properties[i]));
      }

      // debug
      Hashtable<String, String> jmsConfigProps = Notifier.getInstance().getJmsSetupPropsKey();
      Log.debug(Log.FRAMEWORK, "JMSConfigProps is: " + jmsConfigProps);
      String destName = jmsConfigProps.get(JMSSender.JMS_DEST_NAME);

      dumpFailedJMS(
          JMS_DEST_TYPE_TOPIC,
          Notifier.getInstance().getJmsSetupPropsKey(),
          destName,
          notification,
          msgProps);
    }
  }