コード例 #1
0
        /// <exception cref="System.IO.IOException"/>
        /// <exception cref="System.Exception"/>
        public override void StartLocalizer(Path nmPrivateContainerTokens, IPEndPoint nmAddr
                                            , string user, string appId, string locId, LocalDirsHandlerService dirsHandler)
        {
            IList <string> localDirs = dirsHandler.GetLocalDirs();
            IList <string> logDirs   = dirsHandler.GetLogDirs();
            Path           classpathJarPrivateDir = dirsHandler.GetLocalPathForWrite(ResourceLocalizationService
                                                                                     .NmPrivateDir);

            CreateUserLocalDirs(localDirs, user);
            CreateUserCacheDirs(localDirs, user);
            CreateAppDirs(localDirs, user, appId);
            CreateAppLogDirs(appId, logDirs, user);
            Path   appStorageDir = GetWorkingDir(localDirs, user, appId);
            string tokenFn       = string.Format(ContainerLocalizer.TokenFileNameFmt, locId);
            Path   tokenDst      = new Path(appStorageDir, tokenFn);

            CopyFile(nmPrivateContainerTokens, tokenDst, user);
            FilePath cwdApp = new FilePath(appStorageDir.ToString());

            if (Log.IsDebugEnabled())
            {
                Log.Debug(string.Format("cwdApp: %s", cwdApp));
            }
            IList <string> command;

            command = new AList <string>();
            //use same jvm as parent
            FilePath jvm = new FilePath(new FilePath(Runtime.GetProperty("java.home"), "bin")
                                        , "java.exe");

            command.AddItem(jvm.ToString());
            Path cwdPath = new Path(cwdApp.GetPath());
            // Build a temp classpath jar. See ContainerLaunch.sanitizeEnv().
            // Passing CLASSPATH explicitly is *way* too long for command line.
            string classPath = Runtime.GetProperty("java.class.path");
            IDictionary <string, string> env = new Dictionary <string, string>(Sharpen.Runtime.GetEnv
                                                                                   ());

            string[] jarCp = FileUtil.CreateJarWithClassPath(classPath, classpathJarPrivateDir
                                                             , cwdPath, env);
            string classPathJar = LocalizeClasspathJar(new Path(jarCp[0]), cwdPath, user).ToString
                                      ();

            command.AddItem("-classpath");
            command.AddItem(classPathJar + jarCp[1]);
            string javaLibPath = Runtime.GetProperty("java.library.path");

            if (javaLibPath != null)
            {
                command.AddItem("-Djava.library.path=" + javaLibPath);
            }
            ContainerLocalizer.BuildMainArgs(command, user, appId, locId, nmAddr, localDirs);
            string cmdLine      = StringUtils.Join(command, " ");
            string localizerPid = string.Format(LocalizerPidFormat, locId);

            WindowsSecureContainerExecutor.WintuilsProcessStubExecutor stubExecutor = new WindowsSecureContainerExecutor.WintuilsProcessStubExecutor
                                                                                          (cwdApp.GetAbsolutePath(), localizerPid, user, "nul:", cmdLine);
            try
            {
                stubExecutor.Execute();
                stubExecutor.ValidateResult();
            }
            finally
            {
                stubExecutor.Close();
                try
                {
                    KillContainer(localizerPid, ContainerExecutor.Signal.Kill);
                }
                catch (Exception e)
                {
                    Log.Warn(string.Format("An exception occured during the cleanup of localizer job %s:%n%s"
                                           , localizerPid, StringUtils.StringifyException(e)));
                }
            }
        }