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):

要求和我的努力:

每个人都知道如何调用 RMI 代码或 .sh java。因此,我不认为应该在这里粘贴专有代码。

Graceful 需要从同一服务器节点上的 shell 脚本完成。在服务器上,一切都由 Spring 运行。如果我尝试注入一个 Bean,我会死的,因为队列中将有 100x1000 个依赖项。因此我创建了

RMI 客户端(com/common/task/A.java 在同一个 server.jar):

  1. A 可以通过以下方式触发:./myGraceful.sh 停止(例如 java -cp... com.A 2>&1)
  2. 在同一个 server.jar - 因此不可避免地在同一个服务器节点上加载(注意不是 运行)。
  3. 有 p s v main(String args[])
  4. 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% 后停止。因此它实际上从未开始过。问题可以关闭并标记为已解决。