RMI 客户端调用正常关闭。服务器停止。手动重新启动。但不知何故被自动杀死。为什么?
RMI Client invokes Graceful shutdown. Server Stops. Manually started again. But somehow gets autokilled. Why?
一切都在Java。
环境:RedHat Linux12.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}
- 它是一项遗产 class 存在 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(){...}
要求和我的努力:
每个人都知道如何调用 RMI 代码或 .sh java。因此,我不认为应该在这里粘贴专有代码。
Graceful 需要从同一服务器节点上的 shell 脚本完成。在服务器上,一切都由 Spring 运行。如果我尝试注入一个 Bean,我会死的,因为队列中将有 100x1000 个依赖项。因此我创建了
RMI 客户端(com/common/task/A.java 在同一个 server.jar):
- A 可以通过以下方式触发:./myGraceful.sh 停止(例如 java -cp... com.A 2>&1)
- 在同一个 server.jar - 因此不可避免地在同一个服务器节点上加载(注意不是 运行)。
- 有 p s v main(String args[])
- Forks Thread ..thread 在 B 上调用 RMI shutdown ...并且需要线程
自己死去。
问题:
服务器完美关闭。然后,如果我再次发出以下命令:
./script.sh start
服务器启动。但在一分钟内它会自动停止。我不知道是什么以及是什么在停止服务器。我观察了
在我的任何新修改之前:
"./script.sh stop" [used to work flawlessly calling kill -9 $pid ]
"ps - aefwww | grep java" used to show:
pid ppid.. /usr/java/jdk/bin/java ........java -D.... -Djava.timeout=.. -D....
pid ppid.. .../abc/ ....java...
pid ppid.. .../xyz/ .................java...
但是现在
"./myGraceful.sh stop" 触发器已修改 server.jar(现在有 A.java):
"ps - aefwww | grep java" shows:
pid ppid.. .../abc/ ....java...
pid ppid.. .../xyz/ .................java...
下面是一些代码:
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 Arnab"
echo "arg0 : [=15=] pid : $pid"
java -Djava.rmi.server.hostname=localhost \
com.common.task.GracefulRunner $rmiIp $rmiPort $peerId $period 2>&1
echo Done
}
case "" in
start)
get_pids "CustomBootstrap"
if [ "$pid" != "" ] ; then
get_processname "CustomBootstrap"
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
[=15=] run 1>&2 &
sleep 2
[=15=] status
# [=15=] err
;;
stop)
[=15=] kill
;;
kill)
get_pids "CustomBootstrap"
if [ "$pid" != "" ] ; then
kill_server
echo "Server ended at `date`"
else
get_pids "Launcher"
if [ "$pid" != "" ] ; then
kill_server
else
echo "Server is not running !"
fi
fi
;;
esac
A.java
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。
环境:RedHat Linux12.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}
- 它是一项遗产 class 存在 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(){...}
要求和我的努力:
每个人都知道如何调用 RMI 代码或 .sh java。因此,我不认为应该在这里粘贴专有代码。
Graceful 需要从同一服务器节点上的 shell 脚本完成。在服务器上,一切都由 Spring 运行。如果我尝试注入一个 Bean,我会死的,因为队列中将有 100x1000 个依赖项。因此我创建了
RMI 客户端(com/common/task/A.java 在同一个 server.jar):
- A 可以通过以下方式触发:./myGraceful.sh 停止(例如 java -cp... com.A 2>&1)
- 在同一个 server.jar - 因此不可避免地在同一个服务器节点上加载(注意不是 运行)。
- 有 p s v main(String args[])
- Forks Thread ..thread 在 B 上调用 RMI shutdown ...并且需要线程 自己死去。
问题:
服务器完美关闭。然后,如果我再次发出以下命令:
./script.sh start
服务器启动。但在一分钟内它会自动停止。我不知道是什么以及是什么在停止服务器。我观察了
在我的任何新修改之前:
"./script.sh stop" [used to work flawlessly calling kill -9 $pid ]
"ps - aefwww | grep java" used to show:
pid ppid.. /usr/java/jdk/bin/java ........java -D.... -Djava.timeout=.. -D....
pid ppid.. .../abc/ ....java...
pid ppid.. .../xyz/ .................java...
但是现在
"./myGraceful.sh stop" 触发器已修改 server.jar(现在有 A.java):
"ps - aefwww | grep java" shows:
pid ppid.. .../abc/ ....java...
pid ppid.. .../xyz/ .................java...
下面是一些代码:
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 Arnab"
echo "arg0 : [=15=] pid : $pid"
java -Djava.rmi.server.hostname=localhost \
com.common.task.GracefulRunner $rmiIp $rmiPort $peerId $period 2>&1
echo Done
}
case "" in
start)
get_pids "CustomBootstrap"
if [ "$pid" != "" ] ; then
get_processname "CustomBootstrap"
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
[=15=] run 1>&2 &
sleep 2
[=15=] status
# [=15=] err
;;
stop)
[=15=] kill
;;
kill)
get_pids "CustomBootstrap"
if [ "$pid" != "" ] ; then
kill_server
echo "Server ended at `date`"
else
get_pids "Launcher"
if [ "$pid" != "" ] ; then
kill_server
else
echo "Server is not running !"
fi
fi
;;
esac
A.java
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% 后停止。因此它实际上从未开始过。问题可以关闭并标记为已解决。