如何使用Java代码捕获可执行文件运行抛出的异常?

时间:2014-03-02 11:43:42

标签: java

我编写的Java代码只有在成功关闭weblogic服务器后才能运行。

代码关闭weblogic服务器并执行所需的操作,然后重新启动服务器。

现在我的问题是..有没有办法让1可以在weblogic控制台上保留一个标签,以查看关闭过程是否结束,或者在启动或关闭期间服务器是否抛出了一些异常(不是手动但是以编程方式)??

在我的本地机器中,我让线程一直睡眠,直到服务器完全关闭,保持平均关闭时间(手动)。

代码如下:

static final String DOMAIN_NAMES = "domainNames";
static final String DOMAIN_HOME="domainHome";
public static void main(String[] argss) 
{
    AbstractApplicationContext context=new FileSystemXmlApplicationContext(new String[]{"src/main/resources/redeployconfig.xml"});
    StepOneRedeploy stepOne=(StepOneRedeploy) context.getBean("stepOneRedeploy");
    stepOne.setProperties();
    Properties prop=stepOne.getProperties();
    String domainNames = prop.getProperty(DOMAIN_NAMES);
    System.out.println(domainNames);
    String domainHome = prop.getProperty(DOMAIN_HOME);
    StringTokenizer domainNamesTokens= new StringTokenizer(domainNames,",");
    StringTokenizer domainNamesTokens2=domainNamesTokens;

    ArrayList<String> serverIPListArray = new ArrayList<String>();
    while (domainNamesTokens.hasMoreElements()) 
    {
        String domainName=domainNamesTokens.nextToken();
        System.out.println(domainName);
        serverIPListArray.add(domainName);
    }

    while(domainNamesTokens2.hasMoreElements())
    {
        String domainName=domainNamesTokens2.nextToken();


         /** Stopping weblogicserver **/
        String domainPathToShutServer = domainHome + domainName+"/stopWebLogic.cmd";
        String commandToShutServer="cmd /C start "+domainPathToShutServer;

        try 
        {
            Process p = Runtime.getRuntime().exec(commandToShutServer,null);
        } 

        catch (Exception e) 
        {
            e.printStackTrace();
        }


        /**Putting thread to sleep for 1 minute**/
        try {
            Thread.sleep(20000);
        } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }


        /** Deleting temp folder **/
        try
        {
        File delTmpFile=new File("");
        boolean isTmpDelete=delTmpFile.delete();
        System.out.println(isTmpDelete);
        if(!isTmpDelete)
        {
            throw new TempDeleteFailedException("Could not delete Tmp folder for "+domainName);
        }
        }
        catch(TempDeleteFailedException tdfe)
        {
            tdfe.printStackTrace();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        /** Deleting stage folder **/
        try 
        {
            File delStgFile=new File("");
            boolean isStgDelete=delStgFile.delete();
            System.out.println(isStgDelete);
            if(isStgDelete)
            {
                throw new StageDeleteFailedException();
            }
        } 
        catch (StageDeleteFailedException stgDelEileException) 
        {
            stgDelEileException.printStackTrace();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }





        /** Starting weblogicserver **/
        String domainPath = domainHome + domainName+"/startWebLogic.cmd";
        String command="cmd /C start "+domainPath;

        try 
        {
            Process p = Runtime.getRuntime().exec(command,null);
        } 

        catch (Exception e) 
        {
            e.printStackTrace();
        }



    }

}

我已经尝试过ProcessBuilder来启动weblogic服务器。 但它说的是

java.io.IOException: Cannot run program "startWebLogic.cmd" (in directory "D:\Oracle\Middleware\user_projects\domains\ass1"): CreateProcess error=2, The system cannot find the file specified
at java.lang.ProcessBuilder.start(ProcessBuilder.java:470)
at TestMain.main(TestMain.java:35)

引起:java.io.IOException:CreateProcess error = 2,系统找不到指定的文件     at java.lang.ProcessImpl.create(Native Method)     在java.lang.ProcessImpl。(ProcessImpl.java:177)     在java.lang.ProcessImpl.start(ProcessImpl.java:28)     在java.lang.ProcessBuilder.start(ProcessBuilder.java:452)     ......还有1个 所以,如果我要重构问题......

如何使用Java代码捕获可执行文件运行抛出的异常?

2 个答案:

答案 0 :(得分:1)

“等待足够”是一个坏主意,因为它会在情况发生变化时轻易破解,并且使用流程构建器非常有限(更不用说,这些启动脚本通常会将主流程作为一个单独的流程生成,所以你不要不要看他们开始)。

我会研究WebLogic服务器提供的钩子。 WebLogic有很多钩子,所以我不知道哪一个适合你,但是例如,如果它是一个servlet,你可以从ServletContextListener执行关机过程。

答案 1 :(得分:1)

  

有没有办法让1可以在weblogic控制台上保留一个标签,以查看关闭过程是否结束,或者在启动或关闭期间服务器是否抛出了一些异常(不是手动但是以编程方式)? ?

Weblogic日志写入磁盘。默认情况下,它们位于DOMAIN_NAME\servers\SERVER_NAME\logs\SERVER_NAME.log中(参见:Understanding WebLogic logging files)。

只需监视服务器日志中的异常。看看Commons IO - Tailer

顺便说一句,您可以使用WLST和JMX来停止,启动,重新启动和监控Weblogic的运行状况(请参阅ServerRuntimeMBeanServerLifeCycleRuntimeMBean),无需启动独立进程

你可以: