code: @Override
      public void notifyChange() throws CouldNotPerformException, InterruptedException {
          logger.debug("Notify data change of " + this);
          // synchronized by manageable lock to prevent reinit between validateInitialization and publish
          M newData;
          manageLock.lockWrite(this);
          try {
              try {
                  validateInitialization();
              } catch (final NotInitializedException ex) {
                  // only forward if instance was not destroyed before otherwise skip notification.
                  if (destroyed) {
                      return;
                  }
                  throw ex;
              }
  
              // update the current data builder before updating to allow implementations to change data beforehand
              newData = updateDataToPublish(cloneDataBuilder());
              Event event = new Event(informer.getScope(), newData.getClass(), newData);
              event.getMetaData().setUserTime(RPCHelper.USER_TIME_KEY, System.nanoTime());
  
              if (isActive()) {
                  try {
                      waitForMiddleware(NOTIFICATILONG_TIMEOUT, TimeUnit.MILLISECONDS);
                      informer.publish(event);
                  } catch (TimeoutException ex) {
                      ExceptionPrinter.printHistory(new CouldNotPerformException("Skip data update notification because middleware is not ready since "+TimeUnit.MILLISECONDS.toSeconds(NOTIFICATILONG_TIMEOUT)+" seconds of " + this + "!", ex), logger, LogLevel.WARN);
                  } catch (CouldNotPerformException ex) {
                      ExceptionPrinter.printHistory(new CouldNotPerformException("Could not inform about data change of " + this + "!", ex), logger);
                  }
              }
          } finally {
              manageLock.unlockWrite(this);
          }
  
          // Notify data update
          try {
              notifyDataUpdate(newData);
          } catch (CouldNotPerformException ex) {
              ExceptionPrinter.printHistory(new CouldNotPerformException("Could not notify data update!", ex), logger);
          }
  
          dataObserver.notifyObservers(newData);
      }
docs: Synchronize all registered remote instances about a data change.
  
  @throws CouldNotPerformException
  @throws java.lang.InterruptedException