java - 成功执行安全关机后,服务器会频繁启动/停止。怎么了?

标签 java linux multithreading shell rmi

Java上的所有内容。
环境:Red Hat Enterprise Linux 12.3

让我们详细了解一下通信流程:

enter image description here

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/

相关文章:

java - Android MultiAutoCompleteTextView 具有自定义标记器,如 Whatsapp GroupChat

java - 弃用的编译错误

java - jsp servlet文件上传doGet

C# - 如何交出哪个线程从串行端口读取?

Java.lang.classnotfoundException - HelloWorld.class

linux - 未使用的 Docker 容器卡在 Removal in Progress 状态。设备或资源繁忙

c - 不同的进程是否有单独的共享静态变量副本或公共(public)副本?

python - Raspberry RFSniffer 使用 python 读取输出

c# - 如何轻松地将两个异步请求链接在一起?

c# - DebugDiag 消息线程似乎没有等待远程服务器响应