首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 服务器 > 其他服务器 >

JBOSS 定期停止服务,启动服务脚本解决办法

2012-03-01 
JBOSS 定期停止服务,启动服务脚本项目使用 jboss 5.0.1 GA版本,最近总是出现系统 cpu 400%,内存耗尽的问题

JBOSS 定期停止服务,启动服务脚本
项目使用 jboss 5.0.1 GA版本,最近总是出现系统 cpu 400%,内存耗尽的问题,查看jboss日志也没有发现什么问题。
无奈之举,想写一个脚本,每周日的晚上 23 点重启jboss服务,可是写了半天,在windows下都没有成功,请大家查看下,谢谢!

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.util.Date;
import java.io.File;
import java.text.SimpleDateFormat;
import java.io.FileOutputStream;
import java.io.RandomAccessFile;

public class RestartjbossService {
private static String separator = File.separator;
private static String filePath = "d:"+separator+"";  

public static void main(String[] args) throws InterruptedException {
  String cmd1 = "cmd.exe ";// "sh ";//
String cmd2 = "c: ";// "-c ";//
//JBOSS 位置
String cmd31 = "C:"+separator+"jboss-5.0.0.CR2"+separator+"bin"+separator+"shutdown.bat -S";// "/home/posapp/jboss-5.1.0.GA/bin/shutdown.sh -S ";//
String cmd33 = "C:"+separator+"jboss-5.0.0.CR2"+separator+"bin"+separator+"run.bat -b 0.0.0.0 & ";
boolean isRestart = false;
Date date = new Date();
int hours = date.getHours();
if (hours == 14) {
isRestart = true;
}
SimpleDateFormat sim=new SimpleDateFormat("yyyy-MM-dd HH:ss:mm");
while (isRestart) {
try {
String[] cmd = new String[3];
Date start = new Date();
println(sim.format(start) + ":停止服务...........");
cmd[0] = cmd1;
cmd[1] = cmd2; 
cmd[2] = cmd31;
Runtime rt = Runtime.getRuntime();
println("Execing " + cmd[0] + "" + cmd[1] + "" + cmd[2]);
Process proc = rt.exec(cmd);
StreamGobbler errorGobbler = new StreamGobbler(proc.getInputStream(), "ERROR");
StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "OUTPUT");
errorGobbler.start();
outputGobbler.start();

Thread.sleep(1000); 
println("启动服务....... ");
cmd[0] = cmd1;
cmd[1] = cmd2;
cmd[2] = cmd33; 

rt = Runtime.getRuntime();
println("Execing " + cmd[0] + "=" + cmd[1] + "=" + cmd[2]);
proc = rt.exec(cmd);
StreamGobbler e = new StreamGobbler(proc.getInputStream(), "ERROR");
StreamGobbler o = new StreamGobbler(proc.getInputStream(), "OUTPUT");
e.start();  
o.start();
Date end = new Date();
println(sim.format(end) + ":服务启动完成........... ");  
isRestart = false;
} catch (Exception e) {
println(e.getMessage()); 

}
}

static class StreamGobbler extends Thread {
InputStream is;
String type;

StreamGobbler(InputStream is, String type) {
this.is = is;
this.type = type;
}

public void run() {
try {
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null)
RestartjbossService.println(type + "> " + line);
} catch (IOException ioe) {
ioe.printStackTrace();
}

}
//写日志
static void println(String fileContent) {
String fileName = "restartJBoss"+ new SimpleDateFormat("yyyy-MM-dd").format(new Date(System.currentTimeMillis())) + ".log";
File path = new File(filePath);
if (!path.exists()) {
path.mkdir();
}
File file = new File(path, fileName);
// 如果文件长度大于10M,则改名成备份文件进行存储。
if (file.length() > 10 * 1024 * 1024) {
String rename = fileName+ new SimpleDateFormat("yyyyMMddHHmmss").format(new Date(System.currentTimeMillis()));


file.renameTo(new File(path, rename));
}
try {
byte[] temp = { 10, 10 };
byte[] contentdb = fileContent.getBytes("UTF-8");
byte[] content = new byte[contentdb.length + temp.length];
System.arraycopy(contentdb, 0, content, 0, contentdb.length);
System.arraycopy(temp, 0, content, contentdb.length, temp.length);
if (file.exists()) {
// 如果文件存在。则使用随机读写文件用RandomAccessFile类去定义到文件尾后写一条记录
RandomAccessFile accessFile = null;
accessFile = new RandomAccessFile(file, "rw");
accessFile.seek(file.length());
accessFile.write(content);
accessFile.close();
} else {
// 如果文件不存在。则使用写文件流一次性写入。
FileOutputStream stream = new FileOutputStream(file);
stream.write(content, 0, content.length);
stream.close();
}
} catch (IOException ie) {
ie.printStackTrace();
}
}
}

[解决办法]
1. 内存用完靠重启时不能彻底解决问题的,建议用profile等抓一下内存,看看什么在用。
2. 代码没细看,你说没成功,不知道出什么错,大家都很忙,没时间一行行看你的代码的。

[解决办法]
不用自己写,添加一个windows的计划任务就行了,让计划任务去执行关闭操作,然后再执行开启jboss的操作;然后自己再从程序找原因吧;
[解决办法]
哦也,送点分了……
[解决办法]
session bean耗内存,少用。
[解决办法]
CPU过高很可能是程序有死循环。
内存耗尽也可能是死循环过程中不断申请内存导致。
可以考虑kill -3(Linux下)打印一下JVM的堆栈。也可以像一楼说的用profile监控一下。
[解决办法]
呵呵,有时真的很难相信java的程序也会内存耗尽啊。

前几天看了一个写递归没有写返回条件,能让程序无限递归下去的代码。

这让我不得不信,这世界之大真的是无奇不有啊~~

热点排行