code: @FFDCIgnore({ ConfigStartException.class })
      private void update() throws Exception {
          // OK to ignore calls to update() if already busy updating
          if (busy.compareAndSet(false, true)) {
              try {
                  Map<String, String> updated = new HashMap<>();
                  //a last minute check to see if the system is shutting down
                  if (!com.ibm.wsspi.kernel.service.utils.FrameworkState.isStopping()) {
                      Map<String, String> props = source.getProperties();
                      if (props != null) {
                          updated.putAll(props);
                      }
                      if (!updated.equals(current)) {
                          current = updated;
  
                          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                              Tr.debug(tc, "update: Contents of ConfigSource {0} has changed.", this);
                          }
  
                          notifyConfigUpdated();
                      } else {
                          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                              Tr.debug(tc, "update: Contents of ConfigSource {0} has NOT changed.", this);
                          }
                      }
                  } else {
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                          Tr.debug(tc, "update: Parent Config has been garbage collectded.", this);
                      }
                  }
              } catch (ConfigStartException cse) {
                  //Just Re-throw the ConfigStartException, don't FFDC
                  //At the moment this exception means that we could not properly query the config source
                  //It was introduced as a quick fix for issue #3997 but we might reconsider the design at some point
                  throw cse;
              } catch (Exception e) {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "update: Exception updating dynamic source: {0}. Exception: {1}", this, e);
                  }
  
                  throw e;
              } finally {
                  busy.set(false);
              }
          }
  
      }
docs: Go out and poll for updated values via callable.call()
  
  @throws Exception