code: public Map<String,String> invokeServiceAsSubprocess(Long processId,
              Long parentProcInstId, String masterRequestId, Map<String,String> parameters,
              int performance_level) throws Exception
      {
          long startMilli = System.currentTimeMillis();
          if (performance_level<=0) performance_level = getProcessDefinition(processId).getPerformanceLevel();
          if (performance_level<=0) performance_level = default_performance_level_service;
          EngineDataAccess edao = EngineDataAccessCache.getInstance(true, performance_level);
          InternalMessenger msgBroker = MessengerFactory.newInternalMessenger();
          msgBroker.setCacheOption(InternalMessenger.CACHE_ONLY);
          ProcessExecutor engine = new ProcessExecutor(edao, msgBroker, true);
          ProcessInstance mainProcessInst = executeServiceProcess(engine, processId,
                  OwnerType.PROCESS_INSTANCE, parentProcInstId, masterRequestId, parameters, null, null, null);
             boolean completed = mainProcessInst.getStatusCode().equals(WorkStatus.STATUS_COMPLETED);
          Map<String,String> resp = completed?engine.getOutPutParameters(mainProcessInst.getId(), processId):null;
          long stopMilli = System.currentTimeMillis();
          logger.info("Synchronous process executed in " +
                  ((stopMilli-startMilli)/1000.0) + " seconds at performance level " + performance_level);
          if (completed) return resp;
          if (lastException==null) throw new Exception("Process instance not completed");
          throw lastException;
      }
docs: Called internally by invoke subprocess activities to call service processes as
  subprocesses of regular processes.
  @return map of output parameters (can be empty hash, but not null);