Java上的所有内容。
环境:Red Hat Enterprise Linux 12.3
让我们详细了解一下通信流程:
fig1.
NOTE: 1. Old model: There was NO A.java
"script.sh" starts/stops B.java as process
2. New model: There IS A.java
"script.sh" never uses A
"script.sh" starts B.java as process.
"myGraceful.sh" stops process Gracefully
"script.sh" is NEVER used for stopping
服务器(server.jar中的B.java):
Java进程触发为:./script.sh {start | stop}
它是一个已有10年或更长时间的传统课程
有RemoteB接口
已
graceFul(){ ..handles all DB ,user states,connection...etc
..works perfectly from Admin
..invoked as RMI from JSP
..never invoked by script till now
}
initServer(){...}
getUsers(){...}
要求与我的努力:
需要从同一服务器节点上的外壳程序脚本中进行优美处理。在服务器上,Spring运行的所有内容。如果我尝试注入Bean,我将会死掉,因为队列中将会有100x1000的依赖项。因此,我创造了
RMI客户端(同一server.jar中的com / common / task / A.java):
A.java可以通过以下方式触发:./myGraceful.sh stop(例如java -cp ... com.A 2>&1)
同一server.jar中的A.java-因此不可避免地在同一Server节点上加载(注意未运行)。
具有p s v main(String args [])
Forks线程..thread在B上调用RMI关闭...
自己死。
问题:
服务器通过“ myGraceful.sh”完美关闭。
然后,要再次启动服务器,我发出以下命令:
./script.sh start
服务器启动。但是在一分钟内它会自动停止。我不知道什么在阻止服务器。我观察到
在进行任何新修改之前:
"./script.sh stop" [used to work flawlessly calling kill -9 $pid ]
"ps - aefwww | grep java" used to show:
/usr/local/java/bin/java -DSTART_UP_CLASS_PATH_SERVER=com.server.service.ServerServiceImpl -server -Xms1536m -Xmx2048m -Xcheck:jni -XX:MaxPermSize=150m -XX:+AggressiveOpts -Dsun.rmi.transport.tcp.responseTimeout=10000 -Dsun.rmi.transport.tcp.handshakeTimeout=5000 -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime -XX:+HeapDumpOnOutOfMemoryError -XX:+TraceClassLoading -XX:+TraceClassUnloading
但现在
“ ./myGraceful.sh stop”触发修改的server.jar(现在具有A.java):
"ps - aefwww | grep java" shows:
/usr/local/java/bin/java -DSTART_UP_CLASS_PATH_CASINO_SERVER=com.partycasino.combtool.service.CasinoCTServiceImpl -server -Xms1536m -Xmx2048m -Xcheck:jni -XX:MaxPermSize=150m -XX:+AggressiveOpts -Dsun.rmi.transport.tcp.responseTimeout=10000 -Dsun.rmi.transport.tcp.handshakeTimeout=5000 -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime -XX:+HeapDumpOnOutOfMemoryError -XX:+TraceClassLoading -XX:+TraceClassUnloading
/usr/local/java/bin/java -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime -XX:+HeapDumpOnOutOfMemoryError -Dsun.rmi.transport.tcp.responseTimeout=10000 -Dsun.rmi.transport.tcp.handshakeTimeout=5000 -Xmx250m -XX:MaxPermSize=128m
这里有一些代码:
myGraceful.sh:
#!/bin/bash
CLASSPATH=$COMMON_CLASS_PATH:$LIB_INHOUSE/server.jar
rmiIp=x.y.zz.www [hidden]
rmiPort=xxxx [hidden]
peerId=1
period=5
function kill_server(){
echo -n "Shutting down Server ($pid): "
echo "executing A.java"
echo "arg0 : $0 pid : $pid"
java -Djava.rmi.server.hostname=localhost \
com.common.task.A $rmiIp $rmiPort $peerId $period 2>&1
echo Done
}
case "$1" in
start)
get_pids "CustomBootstrap" $2
if [ "$pid" != "" ] ; then
get_processname "CustomBootstrap" $2
if [ "$server" != "" ] ; then
echo "Server already running. pid = $pid"
exit 1
fi
if [ "$ctserver" != "" ] ; then
echo "Shutting down CT Server($pid): "
kill -SIGQUIT $pid
kill -9 $pid
echo Done
fi
fi
$0 run $2 1>&2 &
sleep 2
$0 status $2
# $0 err
;;
stop)
$0 kill $2
;;
kill)
get_pids "CustomBootstrap" $2
if [ "$pid" != "" ] ; then
kill_server
echo "Server ended at `date`"
else
get_pids "Launcher" $2
if [ "$pid" != "" ] ; then
kill_server
else
echo "Server is not running !"
fi
fi
;;
esac
A.java(RMI客户端):
public class A {
class GracefulStopperThread implements Runnable{
private String serverRMIIp = null;
private int serverRmiPort =0;
private String serverPeerId =null;
private int shutDownPeriod =0;
public GracefulStopperThread(String rmiIp,String rmiPort,String peerId,String period){
serverRMIIp = rmiIp;
serverRmiPort = Integer.parseInt(rmiPort);
serverPeerId = peerId;
shutDownPeriod =Integer.parseInt(period);
}
public void run() {
System.out.println("***************************************** GracefulStopper is running *******************************************");
System.out.println("serverPeerId :="+serverPeerId+" , shutDownPeriod :="+shutDownPeriod);
try {
IRemoteServer serverRef = null;
String rmiUrl = getURL(serverRMIIp,serverRmiPort,serverPeerId);
System.out.println("THE RMI URL : "+rmiUrl);
serverRef = (IRemoteServer) Naming.lookup(rmiUrl );
com.server.ds.IRemoteServer pcServerRef = (com.server.ds.IRemoteServer) serverRef;
pcServerRef.graceful(SHUTDOWN_TYPE_SERVER_NOTSYSTEM,"Gracefully Shutting down withing 10 mins", shutDownPeriod);
System.out.println("GracefulStopperThread completed ");
} catch (Exception e) {
e.printStackTrace();
}
}
private String getURL(String rmiIp,int rmiPort,String peerId) {
return new StringBuffer(32).append("rmi://").append(serverRMIIp).append(':').append(serverRmiPort)
.append('/').append(serverPeerId).toString();
}
}
public static void main(String args[]) throws InterruptedException {
A agent = new A();
Runnable stopper = agent.new GracefulStopperThread(args[0],args[1],args[2],args[3]);
Thread t = new Thread(stopper);
t.start();
t.join();
System.out.println("MainThread completed ");
}
}
最佳答案
从catalina和tomcat日志中可以清楚地看到-jmx配置文件中缺少一个错误的JMX条目,与上面的内容无关。这导致Tomcat在启动85%之后停止。因此,它实际上从未开始。
问题可以关闭并标记为已解决。
关于java - 成功执行安全关机后,服务器会频繁启动/停止。怎么了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37158733/