code: @Override
  	public final Object invoke(final String actionName, final Object[] params,
  			final String[] signature) throws MBeanException,
  			ReflectionException {
  		// Get the JmxCommand
  		JmxCommand curCmd = null;
  		for (JmxCommand cmd : this.cmds) {
  			if (cmd.getType().equals(actionName)) {
  				curCmd = cmd;
  				break;
  			}
  		}
  
  		final boolean isSync = actionName.startsWith("sync");
  		try {
  			// initialize arguments for lunching (using Quartz)
  			final Map<String, Object> jobDataMap = buildJobDataMap(curCmd, params);
  
  			final Launch<?> launch = Launcher.getLauncher()
  					.newLaunch((Class<?>) remoteProgram.getAdapterClass()).addParameters(jobDataMap);
  			if (isSync) {
  				// Launch and wait until terminated
  				launch.synchLaunch();
  				return LaunchingMessageKind.ILAUNCH0003.getFormatedMessage(
  						remoteProgram.getAdapterClass().getCanonicalName(), launch.getLaunchId(),
  						launch.getLaunchResult().getStatusCode(),
  						launch.getLaunchResult().getReturnCode());
  			} else {
  				// Launch and continue
  				launch.aSynchLaunch();
  				return LaunchingMessageKind.ILAUNCH0002.getFormatedMessage(
  						remoteProgram.getAdapterClass().getCanonicalName(), launch.getLaunchId());
  			}
  		} catch (LaunchException e) {
  			LaunchingMessageKind.ELAUNCH0003.format(actionName, e);
  		}
  		
  		return null;
  	}
docs: /*
  (non-Javadoc)
  
  @see javax.management.DynamicMBean#invoke(java.lang.String,
  java.lang.Object[], java.lang.String[])