由于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;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public
class
MyRun
...
{
static Runtime runtime = null;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/** *//**
* @param args
*/
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
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("");
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
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();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
try ...{
lockDetail = channelDetail.tryLock();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
} 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;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public
class
Test
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/** *//**
* @param args
*/
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public static void main(String[] args) ...{
// TODO Auto-generated method stub
//超时时间
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
new Thread()...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public void run()...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
try...{
int t = 15000;
Thread.sleep(t);
System.out.print("err: time out "+t);
System.exit(-1);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
}catch(Exception exp)...{exp.printStackTrace();}
}
}.start();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
try...{
File file = new File("test.txt");
FileWriter fw = new FileWriter(file);
Thread.sleep(10000);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for(int i=0;i<args.length;i++)...{
fw.write(args[i]+" ");
}
fw.flush();
Thread.sleep(10000);
fw.write("end");
fw.close();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
}catch(Exception exp)...{
System.out.print("err:"+exp.toString());
}
System.out.println("ok");
System.exit(0);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
run.bat
java Test %
1
%
2
%
3
将 MyRun.java,Test.java,run.bat 放到相应的目录.编译运行.
ok.