java实现外部程序调用

由于tomcat中,再次发布程序,如果不重启tomcat,gmail发送邮件会出异常.原因是,第二次部署程序后,获取不到Session对象.此时Session对象为上一个程序占用,tomcat没有释放资源.(可能理解有错误,不过现象是这样)

于是想在发送邮件的地方调用外部程序,并同步返回执行结果.

MyRun.java

 

import  java.io.BufferedReader;
import  java.io.File;
import  java.io.InputStreamReader;
import  java.io.RandomAccessFile;
import  java.nio.ByteBuffer;
import  java.nio.channels.FileChannel;
import  java.nio.channels.FileLock;
import  java.nio.channels.OverlappingFileLockException;
import  java.text.SimpleDateFormat;
import  java.util.Date;

public   class  MyRun  {
    
    
static Runtime runtime = null;
    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) throws Exception {
        
// TODO Auto-generated method stub
        runtime = Runtime.getRuntime();
    
        String cmd 
= "H:/server_workspace/java_Runtime/run.bat 1 2 3";
        Process process 
= runtime.exec(cmd,null,new File("H:/server_workspace/java_Runtime"));
        BufferedReader in 
=new BufferedReader(new InputStreamReader(process.getInputStream(),"ISO-8859-1"));
        String line 
= null;
        StringBuffer sb 
= new StringBuffer("");
        
while ((line = in.readLine()) != null{
            sb.append(line 
+ " ");
        }

        String st 
= sb.toString().trim();
        
        File logDetailFile 
= new File("log.txt");
        FileChannel channelDetail 
= new RandomAccessFile(logDetailFile, "rw").getChannel(); 
        FileLock lockDetail 
= channelDetail.lock(); 
        
try 
            lockDetail 
= channelDetail.tryLock(); 
        }
 catch (OverlappingFileLockException e) 
            
// File is already locked in this thread or virtual machine 
        }
 
        channelDetail.position(channelDetail.size());
        channelDetail.write(ByteBuffer.wrap(sb.toString().getBytes(
"ISO-8859-1")));
        lockDetail.release(); 
        channelDetail.close();    
    }

}

 Test.java

 

import  java.io.File;
import  java.io.FileWriter;
import  java.util.Map;

public   class  Test  {

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {
        
        
// TODO Auto-generated method stub
        
//超时时间
        new Thread(){
            
            
public void run(){
                
try{
                    
int t = 15000;
                    Thread.sleep(t);
                    System.out.print(
"err: time out "+t);
                    System.exit(
-1);
                }
catch(Exception exp){exp.printStackTrace();}
            }

        }
.start();
        
        
try{
            File file 
= new File("test.txt");
            
            FileWriter fw 
= new FileWriter(file);
            Thread.sleep(
10000);
            
for(int i=0;i<args.length;i++){
                fw.write(args[i]
+" ");
            }

            fw.flush();
            Thread.sleep(
10000);
            fw.write(
"end");
            fw.close();
            
        }
catch(Exception exp){
            System.out.print(
"err:"+exp.toString());
        }

        
        System.out.println(
"ok");
        System.exit(
0);
    }


}

 

run.bat

 

java Test % 1  % 2  % 3

 

将 MyRun.java,Test.java,run.bat 放到相应的目录.编译运行.

ok.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值